我认为像0x88
这样的文字会转向signed int
。但是以下程序的输出与我最初的假设不同。有人可以对此有所了解并解释发生了什么吗?
printf("%hd, %hu\n", 0x88); // output: 136 (10001000), 65416 (11111111 10001000)
如果我的假设是正确的,0x88
首先会被转换为signed int
并成为:
00000000 00000000 00000000 10001000
使用%hd
进行打印时,会将其转换为signed short
,这会产生:
00000000 10001000
并使用%hd
进行打印会将其投放到unsigned short
,这会再次产生这一点:
00000000 10001000
我预计两个printf
的输出都是136。
更新 :错误地遗漏了printf
的其中一个参数。它应该像你们指出的一样:
printf("%hd, %hu\n", 0x88, 0x88);
答案 0 :(得分:5)
在C ++中,所有文字都有一个类型,它们不会“强制转换”。不带任何后缀的整数文字的类型是足以表示该值的最小整数,但不小于int。
因此0x88
的类型为int
。
因此,您的printf必须是:
printf("%d",0x88);
请注意:
printf("%hd, %hu\n", 0x88);
正在调用UB,因为它具有比参数更多的格式说明符。%hd
使用格式说明符short int
时,参数的类型也必须相同。答案 1 :(得分:0)
注意可变功能。 printf
期望与说明符一样多的参数(加上格式本身),这里有2个说明符,但只有一个参数可以格式化。
如果您使用correct line:
#include <cstdio>
int main() {
std::printf("%hd, %hu\n", 0x88, 0x88);
}
你会看到:
136, 136