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

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

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
ANSI C中的整型升级 char,short int或者int型位段(bit-field),包括它们的有符号或无符号变型, 以及枚举类型,可以使用在需要int或unsigned int的表达式中, 如果int可以完整地表示源类型的

  ANSI C中的整型升级

  char,short int或者int型位段(bit-field),包括它们的有符号或无符号变型,

  以及枚举类型,可以使用在需要int或unsigned int的表达式中,

  如果int可以完整地表示源类型的所有值,那么该类型的值就转换为int,否则转换为unsigned int。

  ANSI C中的寻常算术转换

  当执行算术运算时,操作数的类型如果不同,就会发生转换。

  数据类型一般朝着浮点精度更高、长度更长的方向转换,

  整型数如果转换为signed不会丢失信息,就转换为signed,否则就转换为unsigned。

  这个称为值保留(value preserving)原则,与K&R C所采用的无符号保留(unsigned preserving)原则不同。

  浮点类:

  如果一个操作数的类型是long double,那么另一个操作数无论是什么类型都将被转换成long double。

  如果两个操作数都不是long double型,那么当其中一个操作数的类型是double型,则另一个就将被转换成double 型。

  如果两个操作数都不是double型,而其中一个操作数是float型,则另一个被转换成float型。

  注意:double和float都不可用unsigned,short修饰,另外float还不可用long修饰

  整形类规:

  否则,两个操作数都不是三种浮点类型之一,它们一定是某种整值类型。在确定共同的目标提升类型之前,编译器将在所有小于int的整值类型上施加一个被称为整值提升(integral promotion)的过程。在进行整值提升时,类型(char、signed char、unsigned char和short、int)都被提升为类型int。如果机器上的int型足够表示所有unsigned、shoft型的值(这通常发生在short用半个字表示,而int用一个字表示的情况下),则unsigned short int也被转换成int,否则它会被提升为unsigned int。

  wchar_t和枚举类型被提升为能够表示其底层类型(underlying type)所有值的最小整数类型。

  一旦整值提升执行完毕,类型比较就又一次开始。如果一个操作数是unsigned long型,则第二个也被转换成unsigned long型。如果两个操作数的类型都不是unsigned long,而其中一个操作数是long型,则另一个也被转换成long型。long 类型的一般转换有一个例外,如果一个操作数是long型,而另一个是unsigned int型,那么只有机器上的long型足够长,以便能够存放unsigned int的所有值时(一般来说,在32位操作系统中,long型和int 型都用一个字长来表示,所以不满足这里的假设条件),unsigned int才会被转换为long型,否则两个操作数都被提升为unsigned long型。若两个操作数都不是long型,而其中一个是unsigned int型,则另一个也被转换成unsigned int 型。否则两个操作数一定都是int 型。

  int d = -1;

  if (d <= sizeof(arr)/sizeof(arr[0]))

  ...

  这样的比较语句有问题,sizeof运算符返回无符号数。

  if语句在signed int和unsigned int之间测试相等性,

  按照上面的说法,可以这样解释:

  首先,signed int和unsigned int长度相同,不会向更长的方向转换。

  其次,signed int不能完整地表示unsigned int的所有值。

  因此,signed int d被转换为unsigned int类型。

精彩图集

赞助商链接