Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当较大的数据类型(例如int)转换为较小的数据类型(例如short)时,C中会发生什么?_C_Type Conversion - Fatal编程技术网

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

当较大的数据类型(例如int)转换为较小的数据类型(例如short)时,C中会发生什么?,c,type-conversion,C,Type Conversion,当我在下面的代码中遇到这种情况时,我正在玩类型转换 int i = 123456; short s = i; printf("%i",s); 这里,int值由C编译器隐式转换为short。打印此值会在控制台输出上产生-7616。我知道short的范围比int小,但我需要知道C语言是如何从123456得到这个值的——7616,而不是截断它,我想这是一个直观的选择。这个值被截断了,但不是以您期望的方式 十进制值123456具有十六进制值0x1E240。将此值分配给short(在您的情况下为16位)

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

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

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

这个值被截断了,但不是以您期望的方式

十进制值123456具有十六进制值
0x1E240
。将此值分配给
short
(在您的情况下为16位)时,只需要较低的16位,即
0xE240

如果
s
unsigned short
,则其值为57920。但是因为它是有符号的,所以值被解释为有符号的。由于您的机器似乎在使用负数,因此
0xE240
的十进制等效值为-7616(=57920-65536)


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

让我们假设一个4位整数转换为一个2位整数。第一位确定数字是正
(0)
还是负
(1)

0111(12月7日)
转换为
11(12月1日)
。它将切割更高的位。由于第一位
1
表示
-
,因此它将是负数。

数据类型
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
分配的值小于允许的最小值,即[-32768]

值在转换过程中被截断,从而保留较低的有效位,但丢失较高的位,则会看到值继续从最大值(32767)滚动到最小值。这是一致的,无论你使用一个大或小端机

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

在C语言中,当您将int转换为short时,您已经在自找麻烦了。在处理.wav文件等情况下,您通常在使用一系列if语句控制截断之前使用int数据类型来操纵属性

//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;
}
//您需要#包括
int i=123456;
短s;
if(i>SHRT\u-MIN&&i
。它是实现定义的
//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;
}