天天看點

大小端,printf,%s,%d,%c,%x

unsigned type 和 type的差別

unsigned int 和 int的差別,當我們用int定義一個變量時,實際上是在棧上申請了4B的空間,unsigned隻是代表有符号還是沒有符号,并不影響空間的大小,是以unsigned int 範圍0~2³² = 0~ 0~4294967295,而int的範圍是-2的16次~2的16次方 = -2147483648 ~ 2147483647。

至于INT_MAX和INT_MIN的定義

#define INT_MAX 2147483647

#define INT_MIN  (-INT_MAX-1) 

關于宏定義的面試: 複雜的宏定義的時候不要忘記括号;do{...}while(...)的好處;

16位、32位、64位對應的常用資料類型位元組數

隻用掌握不同的,其它的都一樣。

(16位)int 2位元組

(32位)int 4 位元組

指針類型資料類型位元組數:

(32位)char* 4 位元組

(64位)char* 8 位元組

(32位)long   4 位元組

(64位)long   8 位元組

用資料類型定義變量和用printf讀取,用scanf寫入

當我們使用int定義一個變量(或者别的資料類型),實際上是告訴編譯器給我們申請4B的記憶體空間,我們要往其中存放資料。

printf、scanf函數中用到的格式符:

%d

%c

%s

%f        浮點數形式

%lf       長浮點數形式(double類型)

%o        八進制

%x        十六進制 

(%X跟%x是輸出十六進制數字,%X是輸出的十以上的字母大寫,%x是輸出十以上的字母小寫)

%u       

%e       科學計數法輸出

%g       %f或者%e中寬度較短的一種輸出

%p       列印位址。列印一個變量或者指針的位址

第一個問題:當printf的變量和格式符不比對?

有些不比對可以的,因為發生了隐式轉換,比如float類型資料輸出int類型時,編譯器會提示你警告(資料丢失),還有的就是按照ascii值進行char類型到int,int到char之間的轉換。

有的不比對是不可以的,比如int資料按照%s列印,%s會一直向後尋找一個'\0'字元串結束符,但是一直找不到就發生了記憶體通路越界,導緻程式崩潰。

第二個問題:當scanf的變量和格式符不比對?

int a;
double b;

//同樣輸入的數字 a = 1000000000(11位,超過了4B記憶體的最大數值)
// b = 1000000000(11位)
scanf("%d",&a);
scanf("%lf",&b);
           

此時的結果,a提示錯誤,b是可以的。因為根據變量資料類型,在棧上配置設定了4B和8B的空間,當我們通路越界的時候,編譯器會提醒我們發生了錯誤。

大小端