小细节:说说整形提升(Integral promotions)

本文探讨了C++中的整形提升(Integral promotions)原则,强调了在保留精度的前提下进行类型提升,并指出signed和unsigned混用可能导致的精度问题。根据C99 ISO文档6.3.1.3章节,当unsigned和signed混用时,signed类型会转换为unsigned,可能引起值的变化。建议在涉及这两种类型时进行手动强制转换,以避免潜在错误。同时,提醒读者不仅限于C++11文档,也要熟悉C99标准。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整形提升这部分内容,其实C++11 ISO文档里介绍的已经很详细了,但还是容易忘记细节。


相关内容在ISO文档的4.5章节,这里就不重复粘贴上来了。


其实所有算术转换的基本原则都是保留精度的前提下做类型提升。

比如char提升成int。目标类型的优先级也是从小到大,int, unsigned int, long int, unsigned long int, long long int, unsigned long long int。一般是这个顺序。


那么如果signed和unsigned混用会怎么样?这个是个特例,会有精度缺失的问题。


关于这部分内容可以在C99 ISO文档的6.3.1.3章节找到。


其中第二条:


Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or
subtracting one more than the maximum value that can be represented in the new type
until the value is in the range of the new type.


这条说的很清楚,混用unsigned和signed,signed会被强制转换成unsigned类型,由于两种类型边界不同,因此值就有不同。


所以,如果不得不混用这两种类型的话,最好先手动做强制转换。以免出现差错。


另外,C++11文档和C99文档其实有些互补,以后也别只盯着C++11文档,C99也得熟悉,算是一点经验吧。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值