-20左移3位的结果到底是-32还是-160 求详细分析,谢谢
-20的补码: 1110 1100
现在要计算 -20<<3 的值
我按照左移规则 来推理
由 -20<<3 得到 1110 0000
1110 0000 是补码形式, 要求得其原码 则对其求补: 1010 0000 由此我计算的结果是 -32 但是程序运行的结果是 -160 这是怎么来的, 请高人指点, 谢谢
[解决办法]
这是int类型,不是char类型,所以它占了32位,而不是8位,你把它们补齐就知道答案了,是-160的。
[解决办法]
int a = -20;的话a的补码是0xffffffec而不是0xec
所以左移<<3的结果是0xffffff60,结果就是-160
[解决办法]
[解决办法]
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
#include <stdio.h>
unsigned short int ui;
signed short int si;
int main() {
ui=(unsigned short int)0x8000u;
si=( signed short int)0x8000;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=ui>>1;
si=si>>1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
printf("--------------\n");
ui=(unsigned short int)0x8000u;
si=( signed short int)0x8000;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=(( signed short int)ui)>>1;
si=((unsigned short int)si)>>1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
printf("==============\n");
ui=(unsigned short int)0x8000u;
si=( signed short int)0x8000;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=ui<<1;
si=si<<1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
printf("--------------\n");
ui=(unsigned short int)0x8000u;
si=( signed short int)0x8000;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=(( signed short int)ui)<<1;
si=((unsigned short int)si)<<1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
return 0;
}
//ui=32768
//si=-32768
//ui=16384
//si=-16384
//--------------
//ui=32768
//si=-32768
//ui=49152
//si=16384
//==============
//ui=32768
//si=-32768
//ui=0
//si=0
//--------------
//ui=32768
//si=-32768
//ui=0
//si=0
#include <stdio.h>
unsigned int ui;
signed int si;
int main() {
ui=(unsigned int)0x80000000u;
si=( signed int)0x80000000;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=ui>>1;
si=si>>1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
printf("--------------\n");
ui=(unsigned int)0x80000000u;
si=( signed int)0x80000000;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=(( signed int)ui)>>1;
si=((unsigned int)si)>>1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
printf("==============\n");
ui=(unsigned int)0x80000000u;
si=( signed int)0x80000000;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=ui<<1;
si=si<<1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
printf("--------------\n");
ui=(unsigned int)0x80000000u;
si=( signed int)0x80000000;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=(( signed int)ui)<<1;
si=((unsigned int)si)<<1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
return 0;
}
//ui=2147483648
//si=-2147483648
//ui=1073741824
//si=-1073741824
//--------------
//ui=2147483648
//si=-2147483648
//ui=3221225472
//si=1073741824
//==============
//ui=2147483648
//si=-2147483648
//ui=0
//si=0
//--------------
//ui=2147483648
//si=-2147483648
//ui=0
//si=0