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。会造成程序运行时的数据处理错误。
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++
char、signed char、unsigned char的区别,布布扣,bubuko.com
char、signed char、unsigned char的区别
原文地址:http://www.cnblogs.com/ruoweifeng/p/3834951.html