-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
[解决办法]
左移3之后是11111111 11111111 11111111 01100000
[解决办法]
如果char a = -20;的话a补码是0xec,
左移3位的结果是0x60,它的结果是96呢
[解决办法]
大概的意思是这样的,但是你这是只写了8位的,int 是32位的,所以需要全部写出来,你可以参考5L的看看。
[解决办法]
5楼正解。
或者你强制转换成unsigned int 打印出16进制看看就更清楚了
int x = -20;
printf_s("%8d %08x\n%8d %08x\n", x, (unsigned int)x, (x << 3), (unsigned int)(x << 3));
[解决办法]
因为楼主用的教材太烂了,竟然没告诉你这些算术运算至少要升级到int然后才开始运算。
[解决办法]
lz不诧异 -160不在 char的表示范围之内么?
[解决办法]
楼主知道有默认类型转换的
[解决办法]
楼主从根本上就错了,负数左移是连符号位一起移的!
不信输出 (-20)<<27试试就知道了,结果是个正数。
[解决办法]
c99标准
The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with
zeros. If E1 has an unsigned type, the value of the result is E1 ′ 2E2, reduced modulo
one more than the maximum value representable in the result type. If E1 has a signed
type and nonnegative value, and E1 ′ 2E2 is representable in the result type, then that is
the resulting value; otherwise, the behavior is undefined.
[解决办法]
不要迷信书、考题、老师、回帖;
要迷信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
[解决办法]
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!