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的空間,當我們通路越界的時候,編譯器會提醒我們發生了錯誤。