例如
uint8_t value = 256;
调试输出:
0
我读过它会进行某种截断?我没有确切地看到如何,任何链接都表示赞赏。
根据 [conv.integral]
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2^
n
其中n
是用于表示无符号类型的位数)。[注意:在二进制补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。——尾注]如果目标类型是有符号的,则如果它可以在目标类型(和位域宽度)中表示,则该值不变;否则,该值是实现定义的。
因此,对于您的示例,您将可靠地得到零;如果您使用int8_t
而不是uint8_t
,则结果将是实现定义的。(相反,如果对有符号整数的操作溢出,结果是未定义的行为。为什么不一致?我不知道。)
我会试着和你一起理解它。
uint8_t
是 8 位数据类型或字节。它有 8 个插槽,可以是1
或0
. 1111 1111
将是 255。因此,如果您在其中添加一个,它会继续结转。二进制的 255 + 1 会是1 0000 0000
,但由于数据类型只能存储 8 位,所以它会丢弃 1,变成0000 0000
,转换为整数值0
。
至少,这就是我理解它的工作原理。
在无符号整数类型的情况下,最小的适当位数存储在变量中。(布莱恩的回答涵盖了我在这里所说的一切。)
例如,unsigned char a = 257
将导致a=1
.
gcc
当您执行此类分配时,编译器(在这种情况下)应该警告您,例如filename.c:line:column: warning: overflow in implicit constant conversion [-Woverflow]
.