類型提升有點類似於不同數據類型的轉換,當兩個數據之間類型不同時,若直接進行比較或賦值運算時會自動先將兩個不同類型的數據均轉化為其中的某種類型再進行操作,因此發生了類型提升。導致一些意外性讓人茫然的錯誤。
基本介紹
- 中文名:類型提升
- 外文名:Type Promotions
- 類似於:不同數據類型的轉換
- 出現於:程式的編譯期
- 導致:一些意外性讓人茫然的錯誤
C語言中的整型提升規則
#include <inttypes.h> //這裡面定義了一些輸入輸出函式的格式字元串的宏用以保證程式在移植不需要做相應的修改需要至少支持C99的編譯器#include <stdint.h> //可移植類型,需要至少支持C99的編譯器#include <stdio.h>#include <stdlib.h>//本例在某些編譯器的某些參數下某些樣例無法看出整型類型提升規則的表現int main ( void ){ uint16_t unsigned_test = 0; int16_t signed_test = -1; int64_t test = 0; //測試同長signed轉換為unsigned unsigned_test = unsigned_test + signed_test; //這裡的signed_test被提升為unsigned類型 printf( "%"PRIu16"\n" , unsigned_test ); test = unsigned_test; printf( "%"PRId64"\n" , test ); //測試同類型不提升 printf( "int size = %zd int + int size = %zd\n" , sizeof( int ) , sizeof( 1 + 1 ) ); //%zd C99新增,用以輸出size_t類型 //測試不同長,signed短類型提升為unsigned長類型 printf( "unsigned long int size = %zd int + unsigned long int size = %zd\n" , sizeof( unsigned long int ) , sizeof( 1LU + 1 ) ); //測試同長,短類型提升為長類型 printf( "long long int size = %zd int + long long int size = %zd\n" , sizeof( long long int ) , sizeof( 1LL + 1 ) ); return EXIT_SUCCESS; //定義與stdlib.h的宏,用以表示返回成功}
C語言中的浮點類型提升規則
#include <inttypes.h> //這裡面定義了一些輸入輸出函式的格式字元串的宏用以保證程式在移植不需要做相應的修改需要至少支持C99的編譯器#include <stdint.h> //可移植類型,需要至少支持C99的編譯器#include <stdio.h>#include <stdlib.h>//本例在某些編譯器的某些參數下某些樣例無法看出上述浮點類型提升規則的表現int main ( void ){ //測試浮點相加的規則,%zd C99新增,用以輸出size_t類型 printf( "long double size = %zd , long double + float size = %zd\n" , sizeof( long double ) , sizeof( ( long double )1 + ( float )1 ) ); printf( "long double size = %zd , long double + double size = %zd\n" , sizeof( long double ) , sizeof( ( long double )1 + ( double )1 ) ); printf( "double size = %zd , double + float size = %zd\n" , sizeof( double ) , sizeof( ( double )1 + ( float )1 ) ); //測試整型與浮點相加的類型提升 printf( "float size = %zd , long long size = %zd , float + long long int size = %zd\n" , sizeof( float ) , sizeof( long long int ) , sizeof( ( float )1 + 1LL ) ); return EXIT_SUCCESS; //定義與stdlib.h的宏,用以表示返回成功}