C++位移运算符左移怎么计算出int(有符号)所能表示的最大值?
巴扎黑
巴扎黑 2017-04-17 14:27:46
0
6
637

我尝试使用了1<<31,结果得到的值是int的最小值。。。
这是为什么?

巴扎黑
巴扎黑

全部回覆(6)
刘奇

因為這裡預設1是int类型。而你的编译环境下,int`是32位元的。
那麼這個1的二進位表示為

0000 0000 0000 0000 0000    0000 0000 0000 0001

左移32位後

1000 0000 0000 0000 0000    0000 0000 0000 0000

因為是int型,也就是有符號的。所以第一位為符號位,這是一個負數。為什麼是int的最小值,因為是使用的是補碼表示的。

如果需要移出最大值,使用下面的方式

((unsigned int)-1) >> 1

因為-1的二進位表示就是0xffffffff。轉為無符號類型再移位,就不會有符號位的影響。

刘奇

int最大是2的31次方-1,1

洪涛

對於32位的int,左移31位會到最高位
對於有符號數,最高位為符號位,0為正,1為負,所以就變成最小值了,具體原因可以看下int的儲存方式

阿神

(1 (1

((unsigned int)10 : 無符號int 的最小值

阿神

我測試了一下:

#include <stdio.h>

#define STR(x) #x
#define PRINT(x) printf("hex: 0x%08x, dec: %12d, str: \"%s\"\n", x, x, #x )

int main(){
    puts( "全 0 & 全 1" );
    PRINT( 0 );
    PRINT( -1 );

    puts( "\n全 1 的左右 shift" );
    PRINT( -1>>1 );
    PRINT( -1<<1 );

    puts( "\n减法优先级更高" );
    PRINT( 1<<31-1 );
    PRINT( 1<<30 );

    puts( "\n怎么得到 int 的最大正数" );
    PRINT( 0x7FFFFFFF );
    PRINT( 1<<31 );
    PRINT( ((unsigned)1<<31)-1 );
    PRINT( (int)(((unsigned)1<<31)-1) );
    PRINT( ((unsigned int)-1)>>1 );
    PRINT( -1>>1 );

    return0;
}

編譯:gcc test.c -o test

運行:./test

結果:

全 0 & 全 1
hex: 0x00000000, dec:            0, str: "0"
hex: 0xffffffff, dec:           -1, str: "-1"

全 1 的左右 shift
hex: 0xffffffff, dec:           -1, str: "-1>>1"
hex: 0xfffffffe, dec:           -2, str: "-1<<1"

减法优先级更高
hex: 0x40000000, dec:   1073741824, str: "1<<31-1"
hex: 0x40000000, dec:   1073741824, str: "1<<30"

怎么得到 int 的最大正数
hex: 0x7fffffff, dec:   2147483647, str: "0x7FFFFFFF"
hex: 0x80000000, dec:  -2147483648, str: "1<<31"
hex: 0x7fffffff, dec:   2147483647, str: "((unsigned)1<<31)-1"
hex: 0x7fffffff, dec:   2147483647, str: "(int)(((unsigned)1<<31)-1)"
hex: 0x7fffffff, dec:   2147483647, str: "((unsigned int)-1)>>1"
hex: 0xffffffff, dec:           -1, str: "-1>>1"
Ty80

兄弟,把符號位去了是移30位

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!