【问题标题】:What happens to a value assigned to take up more than a types available space? [closed]分配的值占用的空间超过类型可用空间会发生什么? [关闭]
【发布时间】:2016-03-29 19:08:45
【问题描述】:

例如

uint8_t value = 256;

调试输出:

0

我听说它会进行某种截断?我没有确切地看到如何,任何链接都表示赞赏。

【问题讨论】:

标签: c++ memory uint8t


【解决方案1】:

我会试着和你一起理解它。

uint8_t 是 8 位数据类型,或字节。它有 8 个插槽,可以是 101111 1111 将是 255。因此,如果您向其添加一个广告,它会继续保留。二进制的 255 + 1 将是 1 0000 0000,但由于数据类型只能存储 8 位,所以它会去掉 1,变成 0000 0000,转换为整数值 0

至少,我理解它是这样工作的。

【讨论】:

    【解决方案2】:

    根据[conv.integral]

    如果目标类型是无符号的,则结果值是与源一致的最小无符号整数 整数(模 2^n 其中n 是用于表示无符号类型的位数)。 [ 注意: 在一个双 补表示,这种转换是概念性的,位模式没有变化(如果有 是没有截断)。 — 尾注 ]

    如果目标类型是有符号的,则如果它可以在目标类型中表示,则值不变(并且 位域宽度);否则,该值是实现定义的。

    因此,对于您的示例,您肯定会得到零;如果您使用int8_t 而不是uint8_t,则结果将是实现定义的。 (相反,如果对有符号整数的操作溢出,结果是未定义的行为。为什么不一致?我不知道。)

    【讨论】:

    【解决方案3】:

    在无符号整数类型的情况下,最小的适当位数存储在变量中。 (Brian 的回答涵盖了我在这里所说的一切。)

    例如,unsigned char a = 257 将导致 a=1

    编译器(在这种情况下为gcc)应该在您执行此类分配时警告您,例如filename.c:line:column: warning: overflow in implicit constant conversion [-Woverflow].

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 2020-10-11
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 2015-01-12
      • 2017-03-01
      • 1970-01-01
      相关资源
      最近更新 更多