2

例如

uint8_t value = 256;

调试输出:

0

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

4

3 回答 3

3

根据 [conv.integral]

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

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

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

于 2016-03-29T19:12:48.283 回答
3

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

uint8_t是 8 位数据类型或字节。它有 8 个插槽,可以是10. 1111 1111将是 255。因此,如果您在其中添加一个,它会继续结转。二进制的 255 + 1 会是1 0000 0000,但由于数据类型只能存储 8 位,所以它会丢弃 1,变成0000 0000,转换为整数值0

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

于 2016-03-29T19:15:17.367 回答
1

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

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

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

于 2016-03-29T19:09:53.280 回答