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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值