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

Mey*_*sam 1 c++ casting literals

我认为一个字面意思0x88会被投射到signed int.但是以下程序的输出与我最初的假设不同.有人可以对此有所了解并解释发生了什么吗?

printf("%hd, %hu\n", 0x88); // output: 136 (10001000), 65416 (11111111 10001000)
Run Code Online (Sandbox Code Playgroud)

如果我的假设是正确的,那么0x88首先会被投入signed int并成为:

00000000 00000000 00000000 10001000
Run Code Online (Sandbox Code Playgroud)

使用时打印%hd,会signed short产生以下效果:

00000000 10001000
Run Code Online (Sandbox Code Playgroud)

然后用%hd它来打印它unsigned short再次产生这个:

00000000 10001000
Run Code Online (Sandbox Code Playgroud)

我预计两个printfs 的输出都是136.

更新:其中一个参数printf错误地丢失了.它应该像你们所指出的那样:

printf("%hd, %hu\n", 0x88, 0x88);
Run Code Online (Sandbox Code Playgroud)

Pla*_*aHH 5

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

所以类型0x88int.

因此,您的printf必须是:

printf("%d",0x88);
Run Code Online (Sandbox Code Playgroud)

注意:

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