分配给超过类型可用空间的值会发生什么变化?

时间:2016-03-29 19:08:46

标签: c++ memory uint8t

e.g。

uint8_t value = 256;

调试输出:

0

我读过它会做某种截断吗?我没有看到具体的方式,任何链接都受到赞赏。

3 个答案:

答案 0 :(得分:3)

根据[conv.integral]

  

如果目标类型是无符号的,则结果值是与源一致的最小无符号整数   整数(modulo 2 ^ n其中n是用于表示无符号类型的位数)。 [注意:在两个人中   补码表示,这种转换是概念性的,并且位模式没有变化(如果有的话)   不是截断)。 - 结束记录]

     

如果目标类型已签名,则该值不会更改,如果它可以在目标类型中表示(和   位域宽度);否则,该值是实现定义的。

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

答案 1 :(得分:3)

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

uint8_t是8位数据类型或字节。它有8个插槽,可以是101111 1111将为255.因此,如果您对其进行广告,则会继续进行。二进制255 + 1将是1 0000 0000,但由于数据类型只能存储8位,因此它会丢弃1,并变为0000 0000,这将转换为整数值0

至少,这就是我理解它的作用。

答案 2 :(得分:1)

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

例如,unsigned char a = 257会产生a=1

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