我认为像 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);
最佳答案
在 C++ 中,所有文字都有一个类型,它们不会“转换为”。没有任何后缀的整数字面量的类型是足以表示值但不小于 int 的最小整数。
所以0x88
的类型是int
。
因此,您的 printf 必须是:
printf("%d",0x88);
注意:
- 您的
printf("%hd, %hu\n", 0x88);
正在调用 UB,因为它的格式说明符多于参数。 - 使用与参数不同的格式说明符不会进行任何转换,在最坏的情况下还会调用 UB。因此,当您要为
short int
使用格式说明符%hd
时,参数的类型也必须相同。
关于c++ - 在 C++ 中 0x88 文字会转换成什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8803521/