这本书的翻译很烂,网上下载的电子版?
数据类型在运算表达式中的提升,按语言规则是向兼容性的高处提。比如如下代码:
unsigned int a = -1U;
long b = 1L;
if (a > b)
{
}
在if()比较中,就要考虑数据类型的差异了。此处,a将会被提升为long来运算,而假如你书写的a=-1U,它其实是最大正值的int,此时,a>b为真。正常的代码编制,程序员是不会写a=-1U或-1UL这种形式的,自己定义的a是unsigned型,偏要写出负数,那是自取麻烦,抽自己的嘴巴。比较隐蔽的错误,是在非字面值的情况下,比如a的结果是运算出来的,你在别处算出负值,把它赋给a进行运算,此时就很可能没意识到a的值已经不再是负值,而是正值。
通常的编程指南,告诫程序员尽量使用普通有符号的signed型数据,不要乱用unsigned,就是这个道理。这有两个原因,一个是上面所说的问题,第二个是可移植性问题,当你用C为别的语言提供函数库时,要注意某些语言是不支持unsigned这种数据的。unsigned int,在作右移位运算时能够保证无错,在这个时候使用就很好,否则,少用为佳。在逻辑上,对于可确认必须是正数的数据,可以设定为unsigned型,但自己要保证不要把负数赋值给它。
[
本帖最后由 TonyDeng 于 2012-11-14 13:23 编辑 ]