c++ - 在 C++ 中 0x88 文字会转换成什么?

标签 c++ casting literals

我认为像 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/

相关文章:

用于 opengl 的 C++ nuget 包

c++ - 使用 Arduino 将字符串转换为类型 const char*

c++ - C++ 中的类型转换 : why use (type) expression instead of type (expression)

c++ - 这是合法的 C/C++ 吗? `int* p = (int[]) {1,2,3} ;`

c++ - 全局变量还是局部变量更有效?

c++ - 将笛卡尔点存储在 vector 中并输出距离

c++ - 按特定顺序迭代数组元素

需要 Java 泛型类型转换吗?

.net - .Net 是否有任何内置常量用于常见数字,如百万、十亿等?

python - 对于仅包含整数的文件,基数为 10 的 int() 的文字无效