c++int 正负
C++ 中 int
类型的数据范围及其正负表示
数据范围
在 C++ 中,int
是一种常见的整数类型,其具体大小取决于编译器和目标平台。通常情况下,在大多数现代系统上,int
占用 4 字节(32 位)。因此,对于有符号的 int
类型而言,它的取值范围可以通过以下公式计算得出:
[ [-2^{n-1}, 2^{n-1} - 1] ]
其中 ( n ) 表示该数据类型的总位数。由于标准实现下 int
的长度为 32 位,则可以得到如下结果[^1]:
[ [-2^{31}, 2^{31} - 1] = [-2147483648, 2147483647] ]
如果使用无符号形式 (unsigned int
),则整个范围变为非负区间:
[ [0, 2^n - 1] ]
即当 int
长度为 32 位时,
[ [0, 2^{32} - 1] = [0, 4294967295] ]
正负数表示方法
C++ 使用二进制补码来存储带符号整数。这种编码方式允许计算机高效处理加法、减法运算并简化硬件设计。
正数: 对于正值情况,最高有效位 (MSB) 被设置为零作为标志;其余部分按照常规二进制数值解释即可。
负数: 当 MSB 设置为一时表示当前数字是一个负值。此时其他各位共同构成对应绝对值得到反码再加一形成最终储存形态——这就是所谓的“补码”。
例如,考虑一个简单的例子展示如何通过补码机制转换 -5
成内部表现形式假设我们的工作环境仅支持四个比特宽度(char
或者更短):
原始十进制数:-5
步骤:
- 取相反数(去掉前面的'-'号):
5
- 将这个数转成四位二进制字符串:
0101
- 计算按位取反操作后的序列:
1010
- 加入偏移量(+1), 得到最后的结果:
1011
, 这就是机器里实际保存的形式.
验证一下读回过程是否正确:
给定串1011
,
因为首位已经是‘1’所以知道这是个负数,
接着做一次求原码的过程也就是先减掉那个额外增加的一然后再逐位置否最后加上前缀'-', 结果确实是原来的输入值 '-5'.
上述逻辑同样适用于更大的数据结构比如普通的 signed integer types 如上面提到的标准定义下的四字节数组[^2].
#include <iostream>
using namespace std;
int main() {
cout << "Size of int: " << sizeof(int)*8 << "-bits" << endl;
// Example demonstrating range limits.
const unsigned long maxSignedIntValue = ((static_cast<unsigned long>(1)<<sizeof(int)*8)/2)-1;
const unsigned long minSignedIntValue = -(maxSignedIntValue + 1);
cout << "Min value for signed int is : " << minSignedIntValue << endl;
cout << "Max value for signed int is : " << maxSignedIntValue << endl;
return 0;
}
相关推荐


















