当较大的数据类型(例如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;
}