前提知识:在计算机中,所有的算术运算(包括加法、减法、乘法和除法)都是使用补码(Two’s complement)来表示和计算整数的。
数值 | 原码 | 反码 | 补码 |
---|---|---|---|
1 | 0000 0001 | 0000 0001 | 0000 0001 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-128 | 1000 0000(数据位与符号位重合) | 1111 1111 | 1000 0000 |
127 | 0111 1111 | 0111 1111 | 0111 1111 |
0 | 0000 0000 | 0000 0000 | 0000 0000 |
计算器中十进制对应的二进制也都是补码:
比如-128:
-1:
127:
举例说明算数计算中的数据类型提升带来的影响:
#include<iostream>
using namespace std;
int main()
{
// int32_t的数据范围[-2147483648,2147483647]
cout << "INT32_MAX value: " << INT32_MAX << "; INT32_MIN value: " << INT32_MIN << endl;
// uint32_t的数据范围[0, 4294967295]
cout << "UINT32_MAX value: " << UINT32_MAX << endl;
uint32_t a = 100000000;
uint8_t b = 1;
uint32_t c = 100000001;
cout << "-a value:" << -a << endl; // 数据类型不变,整个表达式类型为uint32_t
cout << "b-c value:" << b-c << endl; // 数据类型提升uint32_t,整个表达式类型为uint32_t
cout << "static_cast<int32_t>(-a) value: " << static_cast<int32_t>(-a) << endl; // uint32_t强转为int32_t
cout << "(-a + 0.0) value: " << (-a + 0.0) << endl; // 数据类型提升double,整个表达式类型为double
cout << "static_cast<int32_t>(-a + 0.0) value: " << static_cast<int32_t>(-a + 0.0) << endl; // double强转为int32_t
cout << "static_cast<int32_t>(-a + 0) value: " << static_cast<int32_t>(-a + 0) << endl; // uint32_t强转为int32_t
uint32_t d = 4294960000;
cout << "static_cast<int32_t>(d) value: " << static_cast<int32_t>(d) << endl; // int32_t强转为int32_t
cout << "(d + 0.0) value: " << (d + 0.0) << endl; // 数据类型提升double,整个表达式类型为double
cout << "static_cast<int32_t>(d + 0.0) value: " << static_cast<int32_t>(d + 0.0) << endl; // double强转为int32_t
cout << "static_cast<uint32_t>(d + 0.0) value: " << static_cast<uint32_t>(d + 0.0) << endl; // double强转为uint32_t
}
以上运算结果:
UINT32_MAX value: 4294967295
-a value:4194967296
b-c value:4194967296
static_cast<int32_t>(-a) value: -100000000
(-a + 0.0) value: 4.19497e+09
static_cast<int32_t>(-a + 0.0) value: -2147483648
static_cast<int32_t>(-a + 0) value: -100000000
static_cast<int32_t>(d) value: -7296
(d + 0.0) value: 4.29496e+09
static_cast<int32_t>(d + 0.0) value: -2147483648
static_cast<uint32_t>(d + 0.0) value: 4294960000
Press any key to continue . . .
-100000000的补码与4194967296的补码完全一致,当数据类型不同时,最高位会因数据类型而决定是当符号位还是数据位,比如当前数据类型是uint32_t,那么就是4194967296。
-100000000的补码为:
1111 1010 0000 1010 0001 1111 0000 0000
4194967296的补码为:
1111 1010 0000 1010 0001 1111 0000 0000
在C++中,当一个浮点数被强制转换为一个整数类型时,结果将根据浮点数的值和目标整数类型的范围来确定。如果浮点数的值超出了目标整数类型的表示范围,结果将是未定义的(implementation-defined),这意味着不同的编译器或平台可能会给出不同的结果要么是整数数据类型的最大值、要么是整数数据类型的最小值,以上就是整数数据类型的最小值。