关于C++算术计算中数据截断的讨论

前提知识:在计算机中,所有的算术运算(包括加法、减法、乘法和除法)都是使用补码(Two’s complement)来表示和计算整数的。

数值原码反码补码
10000 00010000 00010000 0001
-11000 00011111 11101111 1111
-1281000 0000(数据位与符号位重合)1111 11111000 0000
1270111 11110111 11110111 1111
00000 00000000 00000000 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),这意味着不同的编译器或平台可能会给出不同的结果要么是整数数据类型的最大值、要么是整数数据类型的最小值,以上就是整数数据类型的最小值。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值