首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

-20左移3位的结果到底是-32还是-160 求详细分析,多谢

2013-02-02 
-20左移3位的结果到底是-32还是-160 求详细分析,谢谢-20的补码: 1110 1100现在要计算 -203 的值我按照左

-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
[解决办法]

引用:
我按照这个运算规则来的:
对负数进行左移:符号位始终为1,其他位左移 ,后面添0
你们帮我分析一下, 怎么做是正确的嘛 , 谢谢啊
-20是int,是11111111 11111111 11111111 11101100,而不是11101100
左移3之后是11111111 11111111 11111111 01100000
[解决办法]
如果char a = -20;的话a补码是0xec,
左移3位的结果是0x60,它的结果是96呢
[解决办法]
引用:
我按照这个运算规则来的:
对负数进行左移:符号位始终为1,其他位左移 ,后面添0
你们帮我分析一下, 怎么做是正确的嘛 , 谢谢啊

大概的意思是这样的,但是你这是只写了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然后才开始运算。
[解决办法]
引用:
对于 int型的分析 很到位,谢谢 
但是 6楼的大哥 对于 char型分析 的结果和我在Eclipse中运行的结果 不一样

char a = -20;
cout << "a<<3 : "<<(a<<3)<<endl;

运行结果:
a<<3 : -160

请帮忙分析一下, 这是为什么? 
因为 char 只占用了一个字节, 那就是 8位, 所以此……

lz不诧异 -160不在 char的表示范围之内么?
[解决办法]
引用:
这是int类型,不是char类型,所以它占了32位,而不是8位,你把它们补齐就知道答案了,是-160的。

楼主知道有默认类型转换的
[解决办法]
楼主从根本上就错了,负数左移是连符号位一起移的!
不信输出 (-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


[解决办法]
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

热点排行