【问题标题】:is 1 in int garanteed to be 00...001 in C?int 中的 1 在 C 中是否保证为 00...001?
【发布时间】:2014-04-02 15:20:16
【问题描述】:

我正在使用 int、char 和 unsigned int。

例如,如果我执行 int foo = 1; ,它是否总是将 foo 创建为 0x00...00001 ?不管它的长度是多少,还是它只适用于无符号类型?

这是因为我在比较位。

【问题讨论】:

  • 在辩论出现之前 - 你知道什么是字节序吗?
  • 除了字节序,您还会发现负数的不同表示形式。
  • 是的@AndrejsCainikovs
  • 即使对于无符号类型,标准也不保证。例如,可能有奇偶校验位。但是,只要你不玩演员表,这些位是不可见的。

标签: c int size bit-manipulation


【解决方案1】:

这个问题有点不明确。 1(十进制)根据定义0x00...001(十六进制)。

您提到“位比较”,所以我假设您真的在问这个:

是否保证foo & (1 << n) 只会对n == 0 评估为true?"。

如果是,答案是“是”。

【讨论】:

    【解决方案2】:

    你会得到很多关于标准实际上关于位表示等的复杂答案。但真正的答案是:是的,1 总是 0x000000.... 1. 大小 - 1 个零位,然而大小是您正在使用的类型中有很多位。

    请注意,类型的长度不是由 C 标准定义的,但您可以轻松找到适合您的平台的长度。即 int 16,24,32,64 位。

    正如有人说得对的那样 - 字节序呢。这可能对您完全不可见,也可能在您的脸上砰砰作响,具体取决于您在做什么以及您有多幸运(如果您一直在大端平台上,您可能永远不会知道字节序是什么)。如果您在 C 中进行位操作,则可以忽略它(>>

    【讨论】:

      【解决方案3】:

      因为 1 是正数,它将仅表示为 0x0000...00001。但在内存中如何存储取决于字节的存储方式。阅读 Big-endian ang little-endian 系统以了解在内存中存储字节。

      【讨论】:

        【解决方案4】:

        来自horse's mouth

        6.2.6.2 整数类型

        1 对于unsigned char 以外的无符号整数类型,对象的位 表示应分为两组:值位和填充位(需要 不是后者)。如果有 N 个值位,每个位应代表不同的 1 和 2 之间 2 的幂N-1 ,因此该类型的对象应能够 使用纯二进制表示表示从 0 到 2N - 1 的值;这应该是 称为值表示。未指定任何填充位的值。53)

        2 对于有符号整数类型,对象表示的位应分为三个 组:值位、填充位和符号位。不需要任何填充位; signed char 不应有任何填充位。应该有一个符号位。 作为值位的每个位应与对象中的同一位具有相同的值 对应无符号类型的表示(如果有符号中有 M 个值位 type 和 N 为无符号类型,则 MN)。如果符号位为零,则不影响 结果值。如果符号位为 1,则该值应修改为 以下方式:

        — 符号位为 0 的对应值取反(符号和幅度);
        — 符号位的值为 -(2M)(二进制补码);
        — 符号位的值为 −(2M − 1)(反码)。

        其中哪个适用是实现定义的,符号位为 1 的值是否适用 并且所有值位为零(对于前两个),或者带有符号位和所有值位 1(对于一个' 补),是陷阱表示或正常值。在标志和 幅度和一个的补码,如果这个表示是一个正常值,它被称为 负零。
        53) 一些填充位组合可能会产生陷阱表示,例如,如果一个填充 位是奇偶校验位。无论如何,对有效值的算术运算都不会产生陷阱 表示不是作为异常情况(如溢出)的一部分,并且这不会发生 无符号类型。填充位的所有其他组合都是替代对象表示 由值位指定的值。

        这实际上意味着有符号正值 1 应将低位值位设置为 1,并将所有其他值位设置为 0。我从未在有填充位的系统上工作过(在至少我必须考虑的任何东西)。

        正如其他人指出的那样,在进行按位运算时,您必须注意字节顺序。

        【讨论】:

          猜你喜欢
          • 2013-11-05
          • 2016-08-16
          • 1970-01-01
          • 2011-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-08
          • 2021-05-18
          相关资源
          最近更新 更多