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

时间:2016-06-24 12:32:05

标签: c type-conversion

当我在下面的代码中看到它时,我正在玩类型转换。

int i = 123456;
short s = i;
printf("%i",s);

这里一个int值被C编译器隐式转换为short。打印此值,在控制台输出上产生-7616。我知道short的范围小于int的范围,但是我需要知道C语言是如何从123456到达-7616而不是截断它的,我猜这是直观的选择。

4 个答案:

答案 0 :(得分:8)

该值被截断,但不符合您的预期。

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

如果sunsigned short,则其值为57920.但由于它已签名,因此该值会被解释为。由于您的计算机似乎使用two's complement representation表示负数,因此0xE240的十进制等值为-7616(= 57920 - 65536)。

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

答案 1 :(得分:1)

在此转换期间,值会被截断,以便保留较低有效位,但丢失较高位。无论您使用大型还是小型端机,这都是一致的。

在您的特定示例中,123456以二进制形式写为11110001001000000。 请记住,整数使用4个字节,因此我从该数字中省略了一堆前导零。短裤限制为2个字节,严格将数字截断为1110001001000000。请注意,前面有一个1,在2的补码中会立即显示负数。 通过2的补充过程可以看出你将如何得到你所做的结果。

在C中,当你将int转换为short时,你已经在寻找麻烦。在使用.wav文件时,通常使用int数据类型来处理属性一系列if语句来控制截断。

//you will need to #include <limits.h>

int i = 123456;
short s;

if(i > SHRT_MIN && i < SHRT_MAX) //if your int is within the range of shorts
{
    s = i;
}


//if your int is too large or too negative, you can control the truncation

if(i < SHRT_MIN) //if int is too negative
{
    i=SHRT_MIN;
}

else //if int is too positive
{
    i=SHRT_MAX;
}

答案 2 :(得分:0)

让我们想象一个4位整数被转换为2位整数。第一位确定该数字是正数(0)还是负数(1)0111 (dec: 7)转换为11 (dec: -1)。它会削减更高的位。由于第一位1代表-,因此它将为负数。

答案 3 :(得分:0)

数据类型short(2字节大小)的值为[-32768]至[32767]。

int main()
{
    int i = 32767;
    short c = i;
    printf("%d\n",c);
    c = i+1;
    printf("%d\n",c);
    c = i+2;
    printf("%d\n",c);
}

//Output:
32767
-32768  << rolling
-32767  << rolling

如果您为short指定的值大于允许的最大值,即[32767]

,则会看到值从最小值(-32768)滚动到最大值
int main()
{
    int i = -32768;
    short c = i;
    printf("%d\n",c);
    c = i-1;
    printf("%d\n",c);
    c = i-2;
    printf("%d\n",c);
}

//Output:
-32768
32767  << rolling
32766  << rolling

如果您看到值从最大值(32767)继续滚动到最小值,如果short被赋值小于允许的最小值,即[-32768]