本帖最后由 duljsky 于 2017-12-14 09:08 编辑
情况1 无符号之间相减
unsigned short a = 1;
unsigned short b = 0xfffe;
unsigned short c = a - b;
printf("%x", c);
结果输出为3;
情况2 无符号之间相减并进行强转
unsigned short a = 1;
unsigned short b = 0xfffe;
unsigned int c = (unsigned int)(a - b);
printf("%x", c);
输出结果为ffff0003;
情况3 无符号之间相减后先转换成16位再强转32位
unsigned short a = 1;
unsigned short b = 0xfffe;
unsigned int c = (unsigned int)(unsigned short)(a-b);
printf("%x", c);
输出结果为3;
以上是在电脑在线编译得到的结果!
这是我的分析:
(前提)计算机只存储补码,究竟是有符号还是无符号数会根据声明自动辨认!
所以,两个无符号数相减实际上是做了a+(-b),是按各数的补码来算的;
情况1 a的补码为1不变,(-b)的补码为各位取反后+1,即2,所以结果为3;
情况2 和情况1不同的是又一个强转的操作,导致加减运算前各变量先进行了自身的转换,
即a的32位补码为0x00000001,(-b)的32位补码(各位取反再+1)为(0xffff0001+1),
所以结果为0xffff0003;
情况3 是先16位之间操作再转换成32位,最后结果是预期的3,同1,也验证了情况2;
但是在DSP中,对情况2进行编译,结果输出为3,并不是0xffff0003,请问是怎么回事,和编译器有关吗,用的CCS3.3!!!
最终得出结论,确切的说是和CPU的位数有关,在做加减运算时,会先转换成当前CPU位数的int型再进行运算,DSP的是16位,也就是int类型为16位的,在线编译的程序表明int是32位的,这样就和编译器没有关系了!
|