Rob*_*ert 2 c promotions type-conversion
#include "stdio.h"
int main()
{
int x = -13701;
unsigned int y = 3;
signed short z = x / y;
printf("z = %d\n", z);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望答案是-4567.我得到"z = 17278".为什么推广这些数字导致17278?
我在Code Pad中执行了这个.
Joh*_*ica 11
隐藏类型转换是:
signed short z = (signed short) (((unsigned int) x) / y);
Run Code Online (Sandbox Code Playgroud)
混合有符号和无符号类型时,未签名的类型会赢.x转换为unsigned int,除以3,然后将该结果下转换为(带符号)short.使用32位整数:
(unsigned) -13701 == (unsigned) 0xFFFFCA7B // Bit pattern
(unsigned) 0xFFFFCA7B == (unsigned) 4294953595 // Re-interpret as unsigned
(unsigned) 4294953595 / 3 == (unsigned) 1431651198 // Divide by 3
(unsigned) 1431651198 == (unsigned) 0x5555437E // Bit pattern of that result
(short) 0x5555437E == (short) 0x437E // Strip high 16 bits
(short) 0x437E == (short) 17278 // Re-interpret as short
Run Code Online (Sandbox Code Playgroud)
顺便说一句,signed关键字是不必要的.signed short是一种较长的说法short.唯一需要明确的类型signed是char.char可以根据平台签名或签名; 默认情况下,所有其他类型始终签名.