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)
在C++中,所有文字都有一个类型,它们不会"强制转换".不带任何后缀的整数文字的类型是足以表示该值但不小于int的最小整数.
所以类型0x88是int.
因此,您的printf必须是:
printf("%d",0x88);
Run Code Online (Sandbox Code Playgroud)
注意:
printf("%hd, %hu\n", 0x88);正在调用UB,因为它具有比参数更多的格式说明符.%hd,short int参数的类型也必须相同.