C語言進階篇一
- 數據類型
- 1.1、內存占用與sizeof運算符
- 1.2、有符號數和無符號數
- 1.3、整形數和浮點型數存儲方式
- 1.4、數據類型轉換
- 1.4.1、隱式轉換
- 1.4.2、強制轉換
數據類型
基本數據類型:char,short,int,long,float,double
復合數據類型:數組,結構體,共用體,類(C語言沒有類型,C++有)
1.1、內存占用與sizeof運算符
變量存儲在內存中,需要占用一定的內存空間。計算機存儲數據都是以補碼的形式來進行存儲的。一個變量占用多少空間是由變量的數據類型決定的。每種數據類型,在不同的機器平臺上占用內存是不同的。我們一般講的時候都是以32位CPU為默認硬件平臺來描述:
char 1字節 8位
short 2字節 16位
int 4字節 32位
long 4字節 32位
float 4字節
double 8字節
1.2、有符號數和無符號數
1、對于char short int long等整形類型的數,都分有符號有無符號數。
2、而對于float和double這種浮點型數來說,只有有符號數,沒有無符號數。
3、對于有符號數和無符號數來說,存儲方式不同的。譬如對于char來說unsigned char無符號數,8位(1字節)全部用來存數的內容 ,而無符號數的補碼就是原碼。所以表示的數的范圍是0(補碼:為0000 0000) ~ 255(補碼為:1111 1111)。
4、signed char表示有符號數,8位中最高位用來存符號(0表示正數,1表示負數),剩余的7位用來存數據。所以可以表示的數的范圍是 -128~127(補碼為:0111 1111)。==對于正數,補碼和原碼相同。-128(補碼是1 1000 0000)。但是是8位,所以最前面的那個1溢出了,直接丟棄。
1.3、整形數和浮點型數存儲方式
對于float和double這種浮點類型的數,它在內存中的存儲方式和整形數不一樣。所以float和int相比,雖然都是4字節,但是在內存中存儲的方式完全不同。所以同一個4字節的內存,如果存儲時是按照int存放的,取的時候一定要按照int型方式去取。如果存的時候和取的時候理解的方式不同,那數據就完全錯了。
#include <stdio.h>int main(void)
{int a = 123;printf("%f\n",a);//將int類型以float形式取出來進行輸出。return 0;
}
0.000000
總結:存取方式上主要有兩種,一種是整形一種是浮點型,這兩種存取方式完全不同,沒有任何關聯,所以是絕對不能隨意改變一個變量的存取方式。在整形和浮點型之內,譬如說4種整形char、short、int、long只是范圍大小不同而已,存儲方式是一模一樣的。float和double存儲原理是相同的,方式上有差異,導致了能表示的浮點型的范圍和精度不同。
#include <stdio.h>int main(void)
{int a = 123;float b = a; //將a里面的數取出來以float形式存儲printf("%f\n",b);return 0;
}
123.000000
1.4、數據類型轉換
不同類型的數據進行運算時,需要轉化為同一類型,才進行運算。
1.4.1、隱式轉換
代碼①:
#include <stdio.h>int main(void)
{int a = 3;float b = 3.5;printf("a+b = %f\n",a+b);printf("a+b = %d\n",a+b);printf("a = %f\n",a);printf("a = %d\n",a);return 0;
}
a+b = 6.500000
a+b = 0
a = 0.000000
a = 3
- 由輸出可知:int類型和float類型進行運算時,運算的過程中int類型a會自動轉換為float類型的臨時變量f1,然后l臨時變量f1在和float類型b進行運算。生成一個臨時變量float類型f2,最后由%f取出進行輸出。
- 由printf(“a = %f\n”,a);可以得出,int類型a轉換為臨時float類型f1。其實是將a變量里面的值取出來,放在一個float類型的變量中,而a中的變量還是int類型。
代碼②:
#include <stdio.h>int main(void)
{int a = 3;float b = 3.5;int c;c = a+b;printf("c = %d\n",c);return 0;
}
c = 6
- 由輸出可知:int類型a先轉換為float臨時變量f1,然后在和float變量b進行運算,生成一個臨時變量f2。將這個臨時變量f2的值取出來賦給int類型的變量c,最后由%d取出進行輸出。
1.4.2、強制轉換
#include <stdio.h>int main(void)
{int a = 3;float b = 3.5;printf("a+b=%d\n",(int)(a+b));return 0;
}
a+b=6
- a+b運算生成的本來是float類型的臨時變量f2,然后通過強制類型轉換為int類型,最后由%d取出進行輸出