| iol |
2011-08-17 17:03 |
关于C++整型提升
为了防止精度损失,如果有必要的话,类型总是被提升为较宽的类型 所有含有小于整数的有序类型的算术表达式在计算之前其类型都会被转换成整型 规则的定义如上面所述,这些规则定义了一个类型转换层次结构.我们从最宽的类型long double开始. 如果一个操作数的类型是long double , 那么另一个操作数无论是什么类型都将被转换成long double . eg: 字符常量小写字母a将被提升为long double , 它的ASC码值为97,然后再被加到long double 类型的文字常量上: 3.14159 + 'a'; 如果两个操作数都不是long double类型,那么若其中一个操作类型是double类型,则另一个就将被转换成double 类型 . eg: int ival; float fval; double dval; //在计算加法前 fval 和 ival 都被转换成double dval+fval+ival; 类似的,如果两个操作数都不是double 类型而其中一个操作数是float类型,则另一个被转换成float类型. eg: char cval; int ival; float fval; //计算加法前 ival和cval 都被转换成double cval+fval+ival; 否则如果两个操作数都不是3种浮点类型之一.他们一定是某种整值类型.在确定共同的目标提升类型之前, 编译器将在所有小于int 的整值类型上施加一个被称为整值提升的过程 在进行整值提升时类型char,signed char,unsigned char 和 short int 都被提升为整型int.如果机器上的类型空间足够表示所有unsigned short类型的值,这通常发生在short用半个字而int用一个字表示的情况下,则unsigned short int 也被转换成int ,否则它会被提升为unsigned int,wchar_t和枚举类型被提升为能够表示其底层类型所有值的最小整数类型, eg: enum status(bad ,ok); 相关联的值是0和1 .这两个值可以但不是必须存放在char类型的表示中.当这些值实际上被作为char类型来存储时,char代表了枚举的底层类型,然后status的整型提升将它的底层类型转换为int eg: char cval; bool found; enum numble{m1.m2,m3} mval; unsigned long ulong; cval + ulong; ulong + found; mval + ulong; ===============洗澡去 |
|