warning:implicit conversion loses integer precision:‘int‘ to ‘unsigned short‘ -- C integer promotion

本文详细介绍了C语言中的整数提升(Cintegerpromotion)现象,指出当对char、shortint等小于int的数据类型进行运算时,它们会被自动提升到int类型。通过代码示例,解释了这一过程可能导致的警告和潜在问题,并提供了解决方案。文章还讨论了整数提升在条件判断和比较操作中的影响,强调了理解整数提升在编程中的重要性。

C integer promotion 理解

先看下导致标题报警的代码:

unsigned char addr;
unsigned short buf;

addr = 0x20;

buf = ((unsigned short)addr) << 8;

本意是想将 unsigned char 型的变量先强制转换成 unsigned short 型,然后左移 8bit 再赋值给一个 unsigned short 型的变量。

但这段代码编译时会报标题的警告。一开始怎么也想不明白,整个代码跟警告中的 int 有什么关系,为什么会导致这个 warning?

经过在网上查找,弄明白了原因,是 C integer promotion 的原因。理解 C integer promotion 后发现确实很容易忽略这个问题造成隐藏的错误,就用上例作为说明来记录一下,避免忽视 C integer promotion 引起的问题。

直接分析上例,在 C 语言中,像 char 和 short int 这种字节数小于 1 个字节(4 bytes),即小于 int 字节数的数据类型,在进行运算时,编译器会自动将他们转化成 int 类型,这就是 C integer promotion

原例代码中将 unsigned char 型变量 addr 先强制转化成 unsigned short 型((unsigned short)addr),本意是考虑因为要做左移运算,unsigned char 型只有一个字节,直接做左移运算会不会造成溢出,所以先将 unsigned char 强制转化成 unsigned short 后再左移,并且以为这样操作后,左移完后的数据((unsigned short)addr

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值