【发布时间】:2016-03-29 19:08:45
【问题描述】:
例如
uint8_t value = 256;
调试输出:
0
我听说它会进行某种截断?我没有确切地看到如何,任何链接都表示赞赏。
【问题讨论】:
-
谁在投票结束此作为要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题?
例如
uint8_t value = 256;
调试输出:
0
我听说它会进行某种截断?我没有确切地看到如何,任何链接都表示赞赏。
【问题讨论】:
我会试着和你一起理解它。
uint8_t 是 8 位数据类型,或字节。它有 8 个插槽,可以是 1 或 0。 1111 1111 将是 255。因此,如果您向其添加一个广告,它会继续保留。二进制的 255 + 1 将是 1 0000 0000,但由于数据类型只能存储 8 位,所以它会去掉 1,变成 0000 0000,转换为整数值 0。
至少,我理解它是这样工作的。
【讨论】:
根据[conv.integral]
如果目标类型是无符号的,则结果值是与源一致的最小无符号整数 整数(模 2^
n其中n是用于表示无符号类型的位数)。 [ 注意: 在一个双 补表示,这种转换是概念性的,位模式没有变化(如果有 是没有截断)。 — 尾注 ]如果目标类型是有符号的,则如果它可以在目标类型中表示,则值不变(并且 位域宽度);否则,该值是实现定义的。
因此,对于您的示例,您肯定会得到零;如果您使用int8_t 而不是uint8_t,则结果将是实现定义的。 (相反,如果对有符号整数的操作溢出,结果是未定义的行为。为什么不一致?我不知道。)
【讨论】:
在无符号整数类型的情况下,最小的适当位数存储在变量中。 (Brian 的回答涵盖了我在这里所说的一切。)
例如,unsigned char a = 257 将导致 a=1。
编译器(在这种情况下为gcc)应该在您执行此类分配时警告您,例如filename.c:line:column: warning: overflow in implicit constant conversion [-Woverflow].
【讨论】: