当我在下面的代码中看到它时,我正在玩类型转换。
int i = 123456;
short s = i;
printf("%i",s);
这里一个int值被C编译器隐式转换为short。打印此值,在控制台输出上产生-7616。我知道short的范围小于int的范围,但是我需要知道C语言是如何从123456到达-7616而不是截断它的,我猜这是直观的选择。
答案 0 :(得分:8)
该值被截断,但不符合您的预期。
十进制值123456具有十六进制值0x1E240
。将此值分配给short
时,在您的情况下看起来是16位,它只需要低16位,即0xE240
。
如果s
为unsigned 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]
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]