【发布时间】:2021-03-26 14:27:45
【问题描述】:
char a = 0b11111111;
printf("%u", a);
我们在一个有符号字符(在 gcc 中默认 char 是有符号的)中存储 1111 1111,意思是 -1。但是我们使用 %u 打印,所以 printf 应该看到 0000 0000 0000 0000 0000 0000 1111 1111。
这个数字,有或没有二进制补码 - 是 255。那么为什么我得到 (2^32 - 1)?似乎程序没有放置前导零(如我所料)而是放置前导零。
【问题讨论】:
-
类型提升。
(char) -1被提升为(int) -1,而后者被传递给printf。 -
"printf 应该看到 0000 0000 0000 0000 0000 0000 1111 1111。" --> 不,用
"%u"打印-1是UB。 -
旁白:假设非标准的
0b11111111完全等价于0xff,而CHAR_MAX为127,那么初始化char a = 0x11111111;将a初始化为实现定义的值,不一定是-1,否则它会引发实现定义的信号。编译器可能会产生警告。 -
当您调用像
printf()这样的可变参数函数时,作为...(省略号)一部分传递的参数将经历default argument promotions。这意味着char被提升为int,而负的char值(当普通char是有符号类型时)被提升为negative integer。
标签: c