C語言入門-資料型別
阿新 • • 發佈:2019-09-27
一、C語言的型別
- 整數:char、short、int、long、longlong
- 浮點型:float、double、long double
- 邏輯:bool
- 指標
- 自定義型別
型別有何不同
- 型別名稱:int、long、double
- 輸入輸出的格式化:%d、%ld、%lf
- 所表達的數的範圍:char<short<int<float<double
- 記憶體所佔的大小:1個位元組到16個位元組
- 記憶體中的表達形式:二進位制(補碼)、編碼
sizeof
是一個運算子,給出某個型別或變數在記憶體中所佔據的位元組數,
是一個靜態運算子,它的結果在編譯的時候就決定了,不要在sizeof的括號中做運算
- sizeof(int)
- sizeof(i)
#include <stdio.h> int main() { int a; a = 6; printf("sizeof(int)=%ld\n", sizeof(int)); printf("sizeof(double)=%ld\n", sizeof(double)); printf("sizeof(a)=%ld\n", sizeof(a)); return 0; } //sizeof(int)=4 //sizeof(double)=8 //sizeof(a)=4
二、整數型別
- char:1位元組(8位元)
- short:2位元組
- int:取決於編譯器(cpu),通常是意義上的1個字
- long:取決於編譯器(cpu),通常是意義上的1個字
- longlong :8位元組
整數內部表達
計算機內部一切都是二進位制
- 18 ------> 00010010
- 0 ------> 000000
- -18 ------> ?
- 負數以原碼的補碼形式表達
反碼:
正數的反碼與原碼相同,負數的反碼為對該數的原碼除符號位外各位取反[每一位取反(除符號位)]。 取反操作指:原為1,得0;原為0,得1。(1變0; 0變1)
補碼:
補碼 = 反碼 + 1
這裡用-1來進行舉例子
- 二進位制:00000001 (1)
- 反碼:11111110
- 補碼:11111111
所以-1在計算機裡用二進位制表達就是全1
總結:
- 正數的反碼和補碼都與原碼相同
- 負數的反碼為對該數的原碼除符號位外各位取反
- 負數的補碼為對該數的原碼除符號位外各位取反,然後在最後一位加1
整數的範圍
- 對於一個位元組(8位),可以表示:00000000-11111111
- 其中:
- 00000000 ------> 0
- 11111111 ~~~ 10000000 ------> -1 ~~ -128
- 00000001 ~~~ 01111111 ------> 1 ~ 127
- char :1位元組:-128~127
- short:2位元組:-32768~32767
- int:取決於編譯器(cpu),通常的意義是“1個字”
- long:4位元組
- longlong:8位元組
unsigned
- 如果一個常量想要表達自己是unsigned,可以在後面加一個U或者u
- 用L或者l表示long
- unsigned的初衷並非擴充套件數能表達的範圍,而是為了做純二進位制運算,主要是移位
#include <stdio.h>
int main()
{
unsigned char c = 255;
int i = 255;
printf("c=%d,i=%d\n", c , i);
// c=-1,i=255
// 當使用了unsigned之後 c=255,i=255
return 0;
}
整數越界
整數是以純二進位制方式進行計算的,所以
- 11111111 + 1 ------> 100000000 ------> 0
- 01111111 + 1 ------> 10000000 ------> -128
- 10000000 - 1 ------> 01111111 ------> 127
也就是在計算機中 127 + 1 = -128,-128 -1 = 127
char a = 127;
char b = -128;
char c = a + 1;
char d = b - 1;
printf("%d, %d\n", c , d );
// -128, 127
如圖所示:順時針為減、逆時針為加
整數的輸入和輸出
只有兩種形式:int或者long long
- %d:int
- %u:unsigned
- %ld:long long
- %lu:unsigned long long
8進位制和16進位制
- 一個以0開始的數字字面量是8進位制
- 一個以0x開始的數字字面量是16進位制
- %o用於8進位制,%x用於16進位制
- 8進位制和16進位制只是如何把數字表達為字串,與內部如何表達數字無關
char c = 012;
int i = 0x12;
printf("c=%d, i=%d\n", c,i);
printf("c=0%o, i=0x%x\n", c,i);
// c=10, i=18
// c=012, i=0x12
選擇整數型別
沒有特別的需要,就選擇int
三、浮點型別
型別 | 字長 | 範圍 | 有效數字 |
---|---|---|---|
float | 32 | 7 | |
double | 64 | 15 |
輸入和輸出
型別 | scanf | printf |
---|---|---|
float | %f | %f、%e |
double | %lf | %f、%e |
其中%e是科學計數法
#include <stdio.h>
int main()
{
double a = 12.321;
printf("%e\n", a );
//1.232100e+001
return 0;
}
輸出精度
在%和f之間加上.n可以指定輸出小數點後幾位,這樣的輸出是做4舍5入的
超出範圍的浮點數
- printf輸出inf表示超出範圍的浮點數:+∞、-∞
- printf輸出nan表示不存在的浮點數
浮點運算的精度
float a , b , c ;
a = 1.345f;
b = 1.123f;
if (c == 2.468)
{
printf("相等\n");
}else
{
printf("不相等\n");
}
//不相等
帶小數點的字面量是double而不是float
float需要用f或者F字尾來表明身份
選擇浮點型別
沒有特殊的需要直接用double
字元型別
- char是一種整數,也是一種特殊的型別:字元
- 用單引號表示的字元字面量:'a' , '1'
- printf和scanf裡用%c來輸入輸出字元
char c;
c = '1';
printf("%d\n", c); // 49 ascll
printf("%c\n", c); // 1
逃逸字元
用來表達無法打印出來的控制字元或者特殊字元,它是由一個反斜槓 開頭,後面跟上另一個字元 ,然後組成一個字元
printf("請輸入身高和體重,如果輸入\"170 80\"表示170cm和80kg\n");
- \b : 回退一格 、\t : 到下一個表格位
- \n : 換行 、 \r:回車
- " :雙引號 、 ':單引號
- \ : 反斜槓本身
自動型別轉換
- 當運算的兩邊出現不一致的型別時,就會出現型別的自動轉換,自動轉化為較大的型別
- 對於printf,任何小於int的型別會被轉換為int,float會被轉換成double
- 但是scanf不會,要輸入short,需要%hd
強制型別轉換
(型別)值
例如:(int)10.2
強制型別轉換的優先順序高於四則運算子
bool
include <stdbool.h>
- 然後就可以使用bool和true、false
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool b = 6 > 5;
bool t = true;
printf("%d\n", b);
// 1
return 0;
}
四、邏輯運算子
邏輯運算子是對邏輯的運算,結果只有0或者1
運算子 | 描述 | 示例 | 結果 |
---|---|---|---|
! | 邏輯非 | !a | |
&& | 邏輯與 | a && b | |
|| | 邏輯或 | a||b |
優先順序
如圖所示:
短路
邏輯運算子是自左向右進行的,如果左邊的結果已經能決定結果了,就不會做右邊的計算
- 對於&&,左邊是false時就不做右邊了
- 對於||,左邊是true時就不做右邊了
條件運算子
- count = (count > 20) ? count - 10 : count + 10;
- 條件、條件滿足時的值、條件不滿足的值
逗號運算
int i,j;
i = 3+4,5+6;
j = (3+4,5+6);
printf("%d\n", i);
printf("%d\n", j);
// 7
// 11
當有括號時,計算的是第二個表達