C語言深度擴充套件 1 資料型別及關鍵字(上)

2021-09-11 01:45:56 字數 3815 閱讀 2230

資料型別可以理解為固定記憶體大小的別名,建立變數的模子

變數本質

範例

有符號資料型別的最高位用於表示資料的符號

在計算機內部用補碼表示有符號數

無符號在計算機內部用原碼表示無符號數

對於固定長度的無符號數

signed 和 unsigned

c語言中預設是有符號型別

unsigned關鍵字宣告變數為無符號型別

c語言中只有整數型別能夠宣告unsigned變數

範例:當無符號 ( unsigned ) 遇到有符號 ( signed )

當無符號數與有符號數混合計算時,會將有符號數轉換為無符號數後再進行計算,結果為無符號數

錯誤地使用了 unsigned

記憶體中的浮點數

浮點數在記憶體的儲存方式為:符號位,指數,尾數

型別符號位

指數尾數

float

1位(第31位)

8位(第23-30位)

23位(第0-22位)

double

1位(第63位)

11位(第52-62位)

52位(第0-51位)

float 和 double 型別的資料在計算機內部的表示法是相同的,但由於所佔儲存空間不同,其分別能夠表示的數值範圍和精度不同。

浮點數儲存示例

浮點數的轉換步驟:

將浮點數轉換成二進位制

用科學計數法表示二進位制浮點數

計算指數偏移後的值

示例:對於指數 6,偏移後的值如下:

float: 127 + 6 -> 133

double: 1023 + 6 -> 1029

10進製浮點數的記憶體表示

實數 8.25 在記憶體中 float 表示:

8.25 轉換成二進位制表示: 1000.01 -> 1.00001 * (2^3)

符號位: 0

指數: 127 + 3 -> 130 -> 10000010

小數:00001

記憶體中的8.25的float表示:

浮點型別的秘密

int型別範圍 [-2^31, 2^31 - 1],float型別範圍 [-3.4 * (10^38), 3.4 * (10^38)]

float能表示的具體數字的個數與int相同

float可表示的數字之間不是連續的,存在間隙

float只是一種近似的表示法,不能作為精確數使用

由於記憶體表示法相對複雜,float的運算速度比int慢的多

注意:

double 與 float 具有相同的記憶體表示法,因此 double 也是不精確的。由於 doubl 占用的記憶體較多,所能表示的精度比 float 高。

c 語言中的變數可以有自己的屬性,在定義變數時可以加上「屬性」關鍵字,用於指明變數具有有特殊意義。

auto

c 語言中區域性變數的預設屬性,編譯器預設所有的區域性變數都是auto的,定義的區域性變數在棧上分配空間。

static

指明變數的「靜態」屬性並具有「作用域限定符」的意義。

static修飾的區域性變數儲存在程式靜態區(靜態區域性變數只會被初始化一次),但作用域還是在區域性,不過生命期與全域性變數相同。

static的另乙個意義是檔案作用域標示符

static修飾前:

static修飾後:

指明將區域性變數儲存於暫存器中(從暫存器取值),只是請求暫存器變數,但不一定請求成功。

作用:用於實時系統要求高時,速度快

if 語句中零值比較的注意點:

bool 型變數應該直接出現於條件中,不要進行比較。( c 語言中沒有 bool 型變數,常用的 bool 型變數是編譯器自製,都是使用列舉方式定義的,0 假 1 或 -1 真,而 c 語言中非 0 真 0 假)

bool b = true;

if(b)

else

普通變數和 0 值或常量比較時,0 值或常量應該出現在比較符號左邊(防止手誤帶來的漏打「=」,建議)

int i =1;

if(0== i)

float 型變數不能直接進行 0 值比較,需要定義精度(計算機整型算的是離散,小數是連續的,故有誤差)

#define epsinon 0.0000001

float f =

0.0;if(

(-epsinon <= f)

&&(f <= epsinon)

)

switch

switch 語句對應單個條件多個分值的情況

case 語句中的值只能是整型或字元型,且分支必須要有 break,否則會導致分支重疊

default 語句有必要加上,以處理特殊情況

case 語句的排列順序

do, while, for

do 語句先執行後判斷,迴圈體至少執行一次

while 語句先判斷後執行,迴圈體可能不執行

for 語句先判斷後執行,相比 while 更簡潔

三種迴圈語句使用對比(累加自然數)

#include

// for

intf1

(int n)

return ret ;

}// while

intf2

(int n)

// do - while

intf3

(int n)

while

(n);

}return ret;

}int

main()

break 和 continue 的區別

C 語言的資料型別寬度擴充套件

編譯執行環境 windows 64bits vs2017 debug win32 在程式設計或者面試過程中,關於資料型別寬度的擴充套件,可能會遇到如下問題 char c 128 printf d c 輸出 128為什麼乙個正整數 128 以整型 int 輸出時變成了乙個負數?在理解上面的問題時,我們...

C語言資料型別關鍵字

變數和常量 常量是設定好不變得量 變數是在執行過程中可以修改或者賦值的量 c語言關鍵字 指只用於語義定義的單詞不能用於其他用途 int short long char unsigned signed float double bool comlex imaginary 整數 整數是指沒有小數的數 關...

C語言 資料型別 關鍵字

字串結束標誌 0 strlen 函式用於獲取字串的有效長度,直到遇到 0 停止。int main printf d n strlen arr 結果應是返回值,因為沒有 0 printf d n sizeof arr 結果為3,3 1 return0 文字檔案末尾 eof 轉義字元 n 轉義字元,代表...