首页 百科知识 字符是带符号的还是无符号的

字符是带符号的还是无符号的

时间:2022-09-22 百科知识 版权反馈
【摘要】:然而,并不是所有的编译器都按照同将的方式解释这些8位数。但一个编译器将一个char转换为一个int却需要作出选择:将char视为带符号量还是无符号量?这决定着8位的字符范围是从-128到127还是从0到255。这样就能保证在转换为整数时是基0的,而不像普通char变量那样在一些实现中是带符号的而在另一些实现中是无符号的。另外,还有一种误解是认为当c是一个字符变量时,可以通过写c来得到与c等价的无符号整数。

7.3 字符是带符号的还是无符号的?

    很多现代计算机支持8位字符,因此很多现代C编译器将字符实现为8位整数。然而,并不是所有的编译器都按照同将的方式解释这些8位数。

 

    这些问题在将一个char制转换为一个更大的整数时变得尤为重要。对于相反的转换,其结果却是定义良好的:多余的位被简单地丢弃掉。但一个编译器将一个char转换为一个int却需要作出选择:将char视为带符号量还是无符号量?如果是前者,将char扩展为int时要复制符号位;如果是后者,则要将多余的位用0填充。

 

    这个决定的结果对于那些在处理字符时习惯将高位置1的人来说非常重要。这决定着8位的字符范围是从-128127还是从0255。这又影响着程序员对哈希表和转换表之类的东西的设计。

 

    如果你关心一个字符值最高位置一时是否被视为一个负数,你应该显式地将它声明为unsigned char。这样就能保证在转换为整数时是基0的,而不像普通char变量那样在一些实现中是带符号的而在另一些实现中是无符号的。

 

    另外,还有一种误解是认为当c是一个字符变量时,可以通过写(unsigned)c来得到与c等价的无符号整数。这是错误的,因为一个char值在进行任何操作(包括转换)之前转换为int。这时c会首先转换为一个带符号整数再转换为一个无符号整数,这会产生奇怪的结果。

 

    正确的方法是写(unsignedchar)c

 

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈