【问题标题】:Typecasting in PythonPython 中的类型转换
【发布时间】:2008-12-22 04:35:18
【问题描述】:

我需要将 Python 中的字符串转换为其他类型,例如无符号和有符号的 8、16、32 和 64 位整数、双精度、浮点数和字符串。

我该怎么做?

【问题讨论】:

标签: python string int bit casting


【解决方案1】:

您可以使用 int 函数将字符串转换为 32 位有符号整数:

str = "1234"
i = int(str)  // i is a 32-bit integer

如果字符串不代表整数,您将收到ValueError 异常。但是请注意,如果字符串确实表示一个整数,但该整数不适合 32 位有符号整数,那么您实际上会得到一个 long 类型的对象。

然后您可以通过一些简单的数学将其转换为其他宽度和符号:

s8 = (i + 2**7) % 2**8 - 2**7      // convert to signed 8-bit
u8 = i % 2**8                      // convert to unsigned 8-bit
s16 = (i + 2**15) % 2**16 - 2**15  // convert to signed 16-bit
u16 = i % 2**16                    // convert to unsigned 16-bit
s32 = (i + 2**31) % 2**32 - 2**31  // convert to signed 32-bit
u32 = i % 2**32                    // convert to unsigned 32-bit
s64 = (i + 2**63) % 2**64 - 2**63  // convert to signed 64-bit
u64 = i % 2**64                    // convert to unsigned 64-bit

您可以使用float 函数将字符串转换为浮点数:

f = float("3.14159")

Python 浮点数是其他语言所指的 double,即它们是 64 位的。 Python 中没有 32 位浮点数。

【讨论】:

  • 有趣的是,对于完全相同的问题stackoverflow.com/questions/374318/… 可以接受不同的答案
  • 嘿。今天早上我花了很长时间调试一些代码,这就是违规者:D
  • @AdamRosenfield 你能解释一下转换为有符号整数背后的数学原理吗?例如,对于一个 32 位整数,我的想法是:获取无符号的 32 位整数,然后取其二进制补码表示的十进制值,但我不确定这如何转换为 @ 987654330@
【解决方案2】:

以下类型——在大多数情况下——首先在 Python 中不存在。在 Python 中,字符串被转换为整数、长整数或浮点数,因为这就是全部。

您首先要求的是与 Python 无关的转换。这是您要求的类型列表及其 Python 等效项。

  • 无符号和有符号 int 8 位,int
  • 无符号和有符号 int 16 位,int
  • 无符号和有符号 int 32 位,无符号:long,有符号 int
  • 无符号和有符号整数 64 位,long

  • 双精度、浮点数

  • 浮动,浮动
  • 字符串,这是你必须开始的内容

我不知道以下是什么,所以我不知道 Python 等价物。

  • 无符号和有符号 8 位,
  • 无符号和有符号 16 位,
  • 无符号和有符号 32 位,
  • 无符号和有符号 64 位。

您已经拥有所有重要的转化:int()long()float()

【讨论】:

  • * 无符号和有符号 8 位,* 无符号和有符号 16 位,* 无符号和有符号 32 位,* 无符号和有符号 64 位。参考位域
  • “位域”是什么意思?一个 int 有 32 位——对我来说它似乎是一个位域。这个“位”字段的属性和操作是什么使其与 int 不同?
【解决方案3】:

Python 只有一个 int 类型。要将字符串转换为int,请像这样使用int()

>>> str = '123'
>>> num = int(str)
>>> num
123

编辑:同样要转换为浮点数,以完全相同的方式使用float()

【讨论】:

  • 我相信所有其他 python 类型也是如此。在我看来,有人想要 C 而不是 Python
【解决方案4】:

如果没有更多信息,我认为不一定能很好地回答这个问题。正如其他人所说,python 中的整数只有 int 和 long ——该语言不遵守低级编程语言的位宽和符号原型。

如果您完全在 python 中操作,那么您可能问错了问题。可能有更好的方法来满足您的需求。

如果您正在与例如 C 代码或通过网络进行互操作,那么有 方法可以做到这一点,看起来您之前帖子的答案很容易涵盖了该途径.

【讨论】:

    【解决方案5】:

    我刚才遇到了一个问题,我有一个值作为 16 位有符号二进制补码从 modbus 传递。 我需要将其转换为签名号码。 我最终写了这个,这似乎工作正常。

    # convert a 32 bit (prob) integer as though it was 
    # a 16 bit 2's complement signed one
    def conv_s16(i):
        if (i & 0x8000):
            s16 = -(((~i) & 0xFFFF) + 1)
        else:
            s16 = i
        return s16
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-23
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2018-03-07
      相关资源
      最近更新 更多