C++位移运算符左移怎么计算出int(有符号)所能表示的最大值?

浏览:27日期:2023-04-21

问题描述

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

问题解答

回答1:

因为这里默认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。转为无符号类型再移位,就不会有符号位的影响。

回答2:

int最大是2的31次方-1,1<<31超范围了,会从最小的负数倒着来

回答3:

对于32位的int,左移31位会到最高位对于有符号数,最高位为符号位,0为正,1为负,所以就变成最小值了,具体原因可以看下int的存储方式

回答4:

(1 << 31) - 1 :有符号int 的最大值(1 << 31) + 1 : 有符号int 的最小值

((unsigned int)1<<32)-1 :无符号int 的最大值0 : 无符号int 的最小值

回答5:

我测试了一下:

#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 & 全 1hex: 0x00000000, dec: 0, str: '0'hex: 0xffffffff, dec: -1, str: '-1'全 1 的左右 shifthex: 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'回答6:

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

相关文章: