C語言數據類型、運算符優先級


C語言類型

  -運算符sizeof

  -整數

    char、short、int、long、long long

  -浮點數

    float、double、long double

  -邏輯

    bool

  -指針

  -自定義類型

 

運算符sizeof

   給出某個類型或者變量在內存中所占據的字節數

    如sizeof(int)  sizeof(a)

   sizeof是一個靜態運算符,它的結果在編譯時刻就決定了,因此不要再sizeof的括號里做運算,這些運算不會被執行

   例如:int a=6;

      int b=sizeof(a++);

      printf("%d",a)      //結果是6而不是7

 

整數類型

    char     1Byte

    short    2Byte

    int     取決於CPU和編譯器,通常是一個字,表示一個寄存器的大小,通常4Byte

    long    取決於CPU和編譯器,4Byte或者8Byte

    long long  8Byte

  以下是64位機執行結果

 

 

整數的內部表達

 

   負數在計算機內部是以補碼的方式存在的,這樣方便加法運算,減法運算可以直接轉換為加法運算。

  實際運算的時候需要注意數據類型的范圍,小心越界

整數的范圍

  0000 0000 ~ 0111 1111  // 0~127

  1111 1111~1000 0000  //-1~-128

  char :  一個字節  -128~127

  short:  兩個字節  -32768~32767

  int:   假如4字節  -2^32-1~2^(32-1)-1

無符號類型

  unsigned char/int/...      //二進制只表示0和正數,不表示負數

  如果一個字面常數想要表達自己是unsigned,可以在后面加上u或者U

  如果一個字面常數想要表達自己是long,可以在后面加上l或L

printf函數

  %d  比int小的類型用%b輸出的時候會轉換成int再輸出

  %u  無符號類型

  %lld

  %lu

  0開頭表示8進制

  0x開頭表示16進制

  %o  輸出8進制

  %x  輸出16進制

浮點類型  

  float  7個有效位  1.23f表示float  scanf %f    printf %f /%e  

  double  15個有效位   1.23表示double  scanf %lf  printf %f/%e

  printf("%.3f",f)  //保留小數點后三位,自動四舍五入,注意如果1.2345一般輸出1.234,因為1.2345實際表示為1.23449999..

浮點數比較大小

  浮點數一般不能直接比較大小,因為精度的問題一般都不相等

  若想比較大小使用

    fabs(f1-f2)<1e-12  //比較float  <1e-18比較double

浮點數表示inf和nan

  printf("%f",12.0/0.0)  //inf

  printf("%f",-12.0/0.0)  //-inf

  printf("%f",0.0/0.0)  //nan

  printf("%d",12/0)  //編譯錯誤

 

字符類型

   單引號表示字符

  %c輸入輸出

  scanf("%d %c")  //不加空格的話后面%c讀入的就是空格

           // 輸入 1  (注意這里有兩個空格)a  讀入的字符仍然是a,因為后面的空格(和換行、制表符)都被讀了

 

逃逸字符

  \"  //表示雙引號

  \b  //回退一格

  \'  //單引號

  \t  //下一個表格位,相當於用了一個tab

  \n  //換行

  \r  //回車,回到行首

類型轉換

  自動轉換為寬類型

  對於printf ,任何小於int的類型都會被轉換成int,float會轉換成double

  但是scanf不會,要輸入short,需要%hd

  強制類型轉換

  (類型)值

  強制類型轉換優先級高於四則運算

  int i=(int)a/b    //錯

  int i=(int)(a/b)    //對

 

#include<stdio.h>
int main()
{
int a = 2147483647;  //int的最大正整數,0后面31個1
int b = -1;//32個1
unsigned int c = 4294967295;//4294967295為32個1
long long int d = 4294967296;//4294967296為1個1后面32個0

printf("sizeof(int) = %d\n", sizeof(int));
printf("sizeof(long long) = %d\n", sizeof(long long));
printf("用int表示一個1后面31個0: \t%d\n", a+1); //a+1就是一個1后面31個0,b+1是一個1后面32個0
printf("用int表示32個1: \t%d\n", b);
printf("用int表示32個0: \t%d\n", b+1);
printf("用long long表示一個1后面31個0: \t%lld\n", a+1);
printf("用long long表示32個1: \t%lld\n", b);
printf("用long long表示1后面32個0: \t%lld\n", b+1);
printf("用long long表示4294967295+1: \t%lld\n", c+1);
printf("用long long表示4294967296: \t%lld\n", d);

return 0;
}

 

 

結論:int強制轉換為long long,會添加32位,第一位加的是0表示正數,printf輸出的時候發生int轉向long long時,先計算后面表達式的值再轉long long,並且后面的表達式先計算的時候仍然會導致越界時候進位丟失,參考以lld格式輸出b+1,b表示32個1,b+1之后變成了32個0,進位丟失,然后再lld輸出的時候前面補上32個0,結果為0。

 

bool 類型

  c語言沒有實際的bool類型,給一個bool類型的數字賦1、2、3等等都是可以的。輸出的時候也是使用%d來輸出,0表示false,1表示true.

 

運算符的優先級

 

邏輯運算符&&和||會短路,對於&&,如果左邊是false,就不會執行右邊,對於||,如果左邊是true,也不會執行右邊。

 

條件運算符  a?b:c  優先級只比賦值高  

逗號運算符  ,  主要用在for循環里面  for(i=0,j=10;i<j;i++,j--)...  優先級比賦值還低

    逗號運算符會把逗號右邊的表達式作為結果返回,例如:

        a=3+4,5+6      //warning:5+6 not used    a的結果是7

        a=(3+4,5+6)    //warning:3+4not used    a的結果是11


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM