84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
我尝试使用了1<<31,结果得到的值是int的最小值。。。这是为什么?
因為這裡預設1是int类型。而你的编译环境下,int`是32位元的。 那麼這個1的二進位表示為
1
类型。而你的编译环境下,
0000 0000 0000 0000 0000 0000 0000 0000 0001
左移32位後
1000 0000 0000 0000 0000 0000 0000 0000 0000
因為是int型,也就是有符號的。所以第一位為符號位,這是一個負數。為什麼是int的最小值,因為是使用的是補碼表示的。
int
如果需要移出最大值,使用下面的方式
((unsigned int)-1) >> 1
因為-1的二進位表示就是0xffffffff。轉為無符號類型再移位,就不會有符號位的影響。
-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,
gcc test.c -o test
運行:./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"
兄弟,把符號位去了是移30位
因為這裡預設
1
是int类型。而你的编译环境下,
int`是32位元的。那麼這個
1
的二進位表示為左移32位後
因為是
int
型,也就是有符號的。所以第一位為符號位,這是一個負數。為什麼是int
的最小值,因為是使用的是補碼表示的。如果需要移出最大值,使用下面的方式
因為
-1
的二進位表示就是0xffffffff
。轉為無符號類型再移位,就不會有符號位的影響。int最大是2的31次方-1,1
對於32位的int,左移31位會到最高位
對於有符號數,最高位為符號位,0為正,1為負,所以就變成最小值了,具體原因可以看下int的儲存方式
(1 (1
((unsigned int)10 : 無符號int 的最小值
我測試了一下:
編譯:
gcc test.c -o test
,運行:
./test
結果:
兄弟,把符號位去了是移30位