有以下简单的C++代码:
#include <stdio.h>
int main() {
char c1 = 130;
unsigned char c2 = 130;
printf("1: %+u\n", c1);
printf("2: %+u\n", c2);
printf("3: %+d\n", c1);
printf("4: %+d\n", c2);
...
return 0;
}
输出是这样的:
1: 4294967170
2: 130
3: -126
4: +130
有人可以解释一下第 1 行和第 3 行的结果吗?
我正在使用Linuxgcc
具有所有默认设置的编译器。
(这个答案假设,在你的机器上,char
范围从 -128 到 127,即unsigned char
范围从 0 到 255,并且unsigned int
范围从 0 到 4294967295,恰好是这种情况。)
char c1 = 130;
这里,130 超出了由 表示的数字范围char
。的价值c1
是实现定义的。在你的情况下,数字恰好“环绕”,初始化c1
to static_cast<char>(-126)
.
In
printf("1: %+u\n", c1);
c1
被提升为int
, 导致-126
。然后,它被解释为%u
说明符为unsigned int
。这是未定义的行为。这次结果数字恰好是由下式表示的唯一数字unsigned int
这相当于 -126 模 4294967296,即 4294967170。
In
printf("3: %+d\n", c1);
The int
value -126
被解释为%d
说明符为int
直接,并按预期输出-126(?)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)