c/c++类型提升问题(int16_t与uint8_t类型加减)

发布时间:2023年12月22日

最近遇到一个问题,一个int16_t类型变量与一个uint8_t类型变量相加,在c++中值为-1,移植到c中值为65535,导致程序错误执行,如下:
int16_t a=-2;
uint8_t b=1;
if(a+b>0)
两者和应该为-1,if判断为假,c++中也确实为假,但移植到c语言中if判断为真,且值为65535。

原因是在c与c++中的类型提升规则不同。
在c++中,类型提升规则为“值保留”,即提升后的值一定与提升前的值相同。当一个int16_t(有符号16位整数)和一个uint8_t(无符号8位整数)进行运算时,uint8_t会被提升为int16_t。这是因为int16_t的范围大于uint8_t。如果将int16_t转换为uint8_t,可能会导致数据丢失,因此在上面计算过程中,将b提升为uint16_t类型,a+b结果为-1

在c中,当一个int16_t和一个uint8_t进行运算时,由于C语言的类型提升规则,int16_t会被提升为uint16_t。a+b结果为-1,那么它会被转换为uint16_t类型,即65535,因此if判断为真,导致程序错误执行。

c中类型提升参考文章:C/C++数据类型转换详解

文章来源:https://blog.csdn.net/weixin_46461874/article/details/135157061
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。