char 高位扩展

Char转为int时高位符号扩展的问题

代码示例: 
static get_utili(const char *p)
{
  int util;while (isspace((int)*p))   //跳过空格
    ++p;
  util = (int) *p++;}
现象&后果: 

当传入的参数p指向的内容为0x9A、0XAB等内容(最高位为1)时,得到的int型变量util的值将会出错,因为char会进行符号扩展,使得0x9A(十进制的154)变成了-102。会造成程序运行时的数据处理错误。

Bug分析: 

char符号扩展是与编译器相关的,但在x86平台上,对于任何主流的编译平台,char总是进行符号扩展的。上述代码在将char型的*p赋给int型变量util的时候,需要先进行char型到unsigned char型的转换,以避免按照char的最高位进行符号扩展
上述出错代码的符号扩展过程如下:
因为要扩展的短数据类型为有符号数的-- char x=10011100b(即0x9A)
因而在int y=(int)x时--进行符号扩展,即短数据类型的符号位填充到长数据类型的高字节位(比短数据类型多出的那一部分),则y的值为11111111 10011100b(变成了十进制的-102);
但是,将要扩展的短数据类型变成无符号数后--unsigned char x=10011100b(即0x9A)
在 int y=(int)x时--进行扩展的时候是以零扩展,即用零来填充长数据类型的高字节位,则y的值应为00000000 10011100b(十进制的154)。

正确代码: 
util = (int) *p++;改成
util = (int)(unsigned char) *p++
Bug定位: 

该bug是在code review的过程中发现的。
char符号扩展的问题,如果在测试时没有构造相应的case,就会很难被发现。面对这类问题,细致的code review是必不可少的,不管是通过code review直接发现问题还是通过review来丰富相应case的构造,code review都应该是一个不可缺少的环节。

编程建议: 

1. 与此bug扩展的相关知识点的参考资料地址
《编程卓越之道》的第一卷:深入理解计算机中,有一节很为详细的介绍了符号扩展、零扩展的相关内容,具体章节为2.7 符号扩展,零扩展,以及缩减。下载地址可参见
http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/
www.writegreatcode.com/
2. 如果必须要进行类型转换的话,建议用c++标准的static_cast

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值