0x88文字在c ++中转换为什么?

时间:2012-01-10 12:47:26

标签: 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);

2 个答案:

答案 0 :(得分:5)

在C ++中,所有文字都有一个类型,它们不会“强制转换”。不带任何后缀的整数文字的类型是足以表示该值的最小整数,但不小于int。

因此0x88的类型为int

因此,您的printf必须是:

printf("%d",0x88);

请注意:

  • 您的printf("%hd, %hu\n", 0x88);正在调用UB,因为它具有比参数更多的格式说明符。
  • 使用不同于参数的格式说明符不会进行任何强制转换,在最坏的情况下也会调用UB。因此,当您想为%hd使用格式说明符short int时,参数的类型也必须相同。

答案 1 :(得分:0)

注意可变功能。 printf期望与说明符一样多的参数(加上格式本身),这里有2个说明符,但只有一个参数可以格式化。

如果您使用correct line

#include <cstdio>

int main() {
  std::printf("%hd, %hu\n", 0x88, 0x88);
}

你会看到:

136, 136