当更大的数据类型(例如int)转换为更小的数据类型(例如,short)时,C中会发生什么?

Abh*_*kur 2 c type-conversion

当我在下面的代码中遇到这种情况时,我正在玩类型转换.

int i = 123456;
short s = i;
printf("%i",s);
Run Code Online (Sandbox Code Playgroud)

这里,一个int值由C编译器隐式转换为short.打印此值,在控制台输出上产生-7616.据我所知,短有一个较小的范围比INT,但我需要知道如何用C语言从123456的,而不是截断它,我的猜测是直观的选择来到这个值-7616.

dbu*_*ush 8

该值被截断,但不是您期望的方式.

十进制值123456具有十六进制值0x1E240.将此值分配给a short(在您的情况下看起来是16位)时,它只需要低16位,即0xE240.

如果sunsigned short,它将具有值57920.但是因为它已经签名,所以该值被解释为这样.由于您的机器似乎使用负数的二进制补码表示,因此十进制等效0xE240值为-7616(= 57920 - 65536).

请注意,此行为是实现定义的,因此您不能依赖于在不同计算机或不同编译器上发生的这种情况.