发生了什么类型的转换?

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.唯一需要明确的类型signedchar.char可以根据平台签名或签名; 默认情况下,所有其他类型始终签名.

  • 值得注意的是,在一般情况下,签名到无符号*转换*不是基于重新解释.事实上,转换和重新解释是非常非常不同的事情,在这种情况下我们所拥有的实际上是*转换*,而不是重新解释. (2认同)