類型提升

類型提升

類型提升有點類似於不同數據類型的轉換,當兩個數據之間類型不同時,若直接進行比較或賦值運算時會自動先將兩個不同類型的數據均轉化為其中的某種類型再進行操作,因此發生了類型提升。導致一些意外性讓人茫然的錯誤。

基本介紹

  • 中文名:類型提升
  • 外文名:Type Promotions
  • 類似於:不同數據類型的轉換
  • 出現於:程式的編譯期
  • 導致:一些意外性讓人茫然的錯誤
C語言中的整型提升規則,C語言中的浮點類型提升規則,

C語言中的整型提升規則

如果運算的運算元是同一類型則不進行類型提升,如果運算元之間的類型不一致且都為整型,當運算元都為無符號整型或者都為無符號整型時,較短的運算元將轉換為較長的運算元再進行運算(即sizeof的值較小的向sizeof較大的轉換),當運算元中即有有符號整型又有無符號整型時,若有符號整型的運算元的長度小於等於無符號整型的運算元那么其將轉換為無符號整型的運算元,若有符號整型的運算元的長度大於無符號整型的運算元,那么有符號整型轉換為無符號整型參與運算後的結果再轉換為有符號整型。
#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語言中的浮點類型提升規則

當運算元中最長的一個類型為long double類型則,其他運算元類型提升至long double類型再進行運算,當最長類型為double則其他運算元提升至double類型,當最長類型為float則其他運算元提升至float類型,在這個過程中整型運算元全部轉換為對應運算元的浮點類型,浮點數進行運算時的結果可能會用範圍與精度更大的浮點類型表示。
#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的宏,用以表示返回成功}

相關詞條

熱門詞條

聯絡我們