C整型升级和寻常算术转换实例(2)
这样,-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。
整型提升就是char、short int和位段类型(无论signed或unsigned)以及枚举类型将被提升为int,
前提是int 能够完整地容纳原先的数据,否则将被转换为unsigned int。
ANSI C表示,如果编译器能够保证运算结果一致,
也可以省略类型提升――这通常出现在表达式中存在常量操作数的时候。
另一个会发生隐式类型转换的地方就是参数传递。
在K&R C中,由于函数的参数也是表达式,所以也会发生类型提升。
在ANSI C中,如果使用了适当的函数原型,类型提升便不会发生,否则也会发生。
在被调用函数的内部,提升后的参数被裁减为原先声明的大小。
这就是为什么单个的printf()格式字符串%d能适用于几个不同类型,
short、char或int,而不论实际传递的是上述类型的哪一个。
函数从堆栈中(或寄存器中)取出的参数总是int类,并在printf或其他被调用函数里按统一的格式处理。
printf是一个可变参数函数,此时一般的参数提升始终会发生。
- 上一篇:c语言中static使用方法
- 下一篇:c语言的main的所有写法