有以下简单的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 行的结果吗?
我正在使用所有默认设置的 Linux gcc
编译器。
最佳答案
(这个答案假设,在你的机器上,char
的范围从 -128 到 127,unsigned char
的范围从 0 到 255,unsigned int
的范围从 0 到 4294967295,这恰好是这种情况.)
char c1 = 130;
此处,130 超出了 char
可表示的数字范围. c1
的值是实现定义的。在您的情况下,数字恰好“环绕”,初始化 c1
至 static_cast<char>(-126)
.
在
printf("1: %+u\n", c1);
c1
被提升为int
,导致 -126
.然后,它由 %u
解释说明符为 unsigned int
.这是未定义的行为。这次得到的数字恰好是由 unsigned int
表示的唯一数字。这与 -126 模 4294967296 一致,即 4294967170。
在
printf("3: %+d\n", c1);
int
值 -126
由 %d
解释说明符为 int
直接,并按预期输出 -126 (?)。
关于c++ - Printf 函数格式化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56424618/