龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C整型升级和寻常算术转换实例(2)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
这样,-1就变成一个非常巨大的正整数,导致比较结果与预期的不符。 解决的方法是使用强制转换,(int)(sizeof(arr)/sizeof(arr[0]))。 我在VC++ 6.0和DEV-C++ 4.9.9.

  这样,-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是一个可变参数函数,此时一般的参数提升始终会发生。

精彩图集

赞助商链接