怪我咯2017-04-17 14:29:46
因為這裡預設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
。轉為無符號類型再移位,就不會有符號位的影響。
阿神2017-04-17 14:29:46
(1 << 31) - 1 :有符號int 的最大值
(1 << 31) + 1 : 有符號int 的最小值
((unsigned int)1<<32)-1 :無符號int 的最大值
0 : 無符號int 的最小值
阿神2017-04-17 14:29:46
我測試了一下:
#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"