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