C++中1 << 31 - 1相当于INT_MAX吗?

在 C++ 中,1 << 31 - 1 不相当于 INT_MAX,而且这是一个有问题的表达式,让我们分步分析:

  1. 表达式解析
    1 << 31 - 1 在 C++ 中会被解析为 1 << (31 - 1) ,这是因为减法优先级高于左移,结果等于1 << 30

  2. 实际值
    1 << 30 的结果是:

  • 二进制:0100 0000 0000 0000 0000 0000 0000 0000
  • 十进制:1,073,741,8241,073,741,8241,073,741,824
  • 十六进制:0x40000000
  1. INT_MAX 比较
    在32位系统中,INT_MAX 通常是:
  • 二进制:0111 1111 1111 1111 1111 1111 1111 1111
  • 十进制:2,147,483,6472,147,483,6472,147,483,647
  • 十六进制:0x7FFFFFFF
    可以看到 1 << 30 (1,073,741,8241,073,741,8241,073,741,824) 远小于 INT_MAX (2,147,483,6472,147,483,6472,147,483,647)。
  1. 重要警告:1 << 31 在32位系统中是未定义行为!

    因为对有符号整数左移导致溢出(符号位被修改)。

  2. 安全的做法

  • 使用无符号整数:(1U << 31) - 1 ,在32位系统中等于 231−12^{31} - 1231−1 ,即 INT_MAX
  • 使用 long long 避免溢出:(1LL << 31) - 1
  • 使用 INT_MAX
  • 使用 0x7FFFFFFF
  1. 正确的 INT_MAX
C++ 复制代码
#include <climits>
int max_int = INT_MAX;  // 最安全、最可移植的方式

总之,1 << 31 - 11 << 30,而 INT_MAX 是 231−12^{31} - 1231−1,两者完全不同。

相关推荐
WWJA王文举7 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
ShineWinsu8 小时前
对于C++:C++11中lambda、function、bind的解析
c++·面试·笔试·开发·lambda·bind·function
码匠许师傅8 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
qq_448011168 小时前
C语言中的动态内存分配
c语言·开发语言·php
动词ing9 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习
旖旎夜光9 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
汉字萌萌哒9 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
hy.z_77710 小时前
【C++】13. 继承
c++
汉字萌萌哒10 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
小雨笙笙11 小时前
C语言:变量三属性——存储类型
c语言·开发语言