使用各种格式说明符打印short int

roo*_*kea 3 c casting integer-arithmetic

请看一下这段代码:

#include <stdio.h>
int main(void)
{
short s = -1;

printf("sizeof(short) = %lu\n", sizeof(short));
printf("sizeof(int) = %lu\n", sizeof(int));
printf("sizeof(long) = %lu\n", sizeof(long));
printf("s = %hd\n", s);
printf("s = %d\n", s);
printf("s = %ld\n", s);

return 0;
}  
Run Code Online (Sandbox Code Playgroud)

它给出了输出:

sizeof(short) = 2  
sizeof(int) = 4  
sizeof(long) = 8  
s = -1  
s = -1  
s = 4294967295  
Run Code Online (Sandbox Code Playgroud)

在最后一行,为什么s = 4294967295不是s = -1通过这个问题,我才知道在C中,当变量被提升时,它的值保持不变.

Jas*_*onD 6

s正被提升为一个int,这是一个4字节类型.所有3例都发生了这种情况.在前两个中,a intprintf()预期的,因为格式说明符是一个将作为一个类型传递的类型int.但是在最后一种情况下,您给出了一个格式说明符,它需要一个8字节的类型.

这是在调用未定义的行为.

在您的情况下,它似乎在值的高字节中读取零,实际上零扩展到64位已经符号扩展为32位的值.但是,您无法依赖于执行此操作的结果 - 它可能是读取内存或未始终初始化的寄存器.明天可能会有所不同.

参数的提升不依赖于格式字符串 - 您必须始终确保为您指定的格式传递正确的参数.所以int不会被提升为long.你需要自己转换它.

一个聪明的编译器应该给你一个警告.