if语句在signed int和unsigned int之间测试相等性,按照上面的说法,可以这样解释:
首先,signed int和unsigned int长度相同,不会向更长的方向转换。
其次,signed int不能完整地表示unsigned int的所有值。
因此,signed int d被转换为unsigned int类型。
这样,-1就变成一个非常巨大的正整数,导致比较结果与预期的不符,解决的方法是使用强制转换,(int)(sizeof(arr)/sizeof(arr[0]))。
我在VC++ 6.0和DEV-C++ 4.9.9.0中尝试了上面那段代码,的确如此。
不要因为无符号数不存在负值而用它表示数量(如年龄、国债等),尽量使用int之类的有符号数,这样在混合运算中,这样就不必担心边界情况(如-1被翻译为非常大的正数)。
只有在使用位段和二进制掩码时,才使用无符号数;应该在表达式中使用强制类型转换,使所有的操作数均为有符号数或无符号数,这样就不必由编译器来选择结果的类型。
C语言中的类型转换比一般人想象中的要广泛得多,在涉及类型小于int或double的表达式中,都有可能出现类型转换。
printf(" %d ", sizeof ’A’);
的结果是4, 是int的长度,编译器首先将’A’升级为整数97,再调用sizeof。
责任编辑:小草