1. 程式人生 > >第三章c語言整型和浮點數型

第三章c語言整型和浮點數型

1。c語言可移植型別:stdint.h 和 inttypes.h
#include<stdio.h>
#include<inttypes.h>

int main(int argc, char const *argv[])
{
	int32_t me32;

	scanf("%"SCNd32,&me32);
	printf("me32 = %d\n", me32);

	printf("me32 = %" PRId32 "\n", me32 );

	return 0;
}
2。程式中的警告,表示的意思為:儘管編寫的程式碼有效,但有可能不是程式猿想要的
3。計算機把浮點數分成小數部分和指數部分來表示

在計算機中將浮點數按照IEEE754標準來儲存

我們在將一個浮點數進行儲存時,先將其轉換成2進位制的浮點數表示形式,隨後按照圖中的部位分別來進行儲存。

如 float a = 3.5 這裡機器中float儲存為32位,所以

IEEE 754規定,對於32位的浮點數,最高的1位是符號位s,接著的8位是指數E,剩下的23位為有效數字M。

我們的3.5轉化成二進位制為11.1 = 1.11 * 2^1
s = 0
由於M在儲存的時候,規格化的浮點數要求1≤M<2,也就是說,M可以寫成1.xxxxxx的形式,其中xxxxxx表示小數部分。IEEE 754規定,在計算機內部儲存M時,預設這個數的第一位總是1,因此可以被捨去,只儲存後面的xxxxxx部分。
M = 11


E的話,首先其為無符號數,但是轉化成二進位制科學計數法的時候其E可能出現負數,所以需要加上一個中間值,32位數加上127,64位加上1023
E = 1+127 = 128

所以儲存的為

0 10000000 11000000 00000000 0000000

我們用程式來驗證一下記憶體中是否是這樣儲存的

#include<stdio.h>

int main(int argc, char const *argv[])
{
	float a = 3.5;
	printf("float = %zd\n",sizeof(float));
	char *p = (char*) &a;
	printf("%d\n", *p);
	printf("%d\n", *(p+1));
	printf("%d\n", *(p+2));
	printf("%d\n", *(p+3));
	return 0;
}


由於我是小端機,所以儲存的時候從低位開始儲存為:

000000000 00000000 011000000 01000000

轉化成十進位制正好為 0 0 96 64

下圖為雙精度數在記憶體中的儲存方式

在這裡插入圖片描述

3。c標準對基本資料型別只規定了允許的最小大小
4。c編譯器在儲存short的時候自動將short的值轉化成int型別的值。因為int型別的值被認為是計算機處理整數型別時最高效的值。
5。char是8bit,所以如果像下面這樣賦值的話
char c = 'ASD';
printf("%c\n", c);
結果為:D

想把24bit存到8bit中,8bit後面的字元會覆蓋前面的,所以最後打印出來的結果只是D

6。 八進位制和十六進位制都是 unsigned int 型別 用%u來列印

2.0e30是double型別 科學計數法的數可以用%e來將其打印出。

7。負數的儲存方式:取反加1

int a = -234
將234其轉換成二進位制形式,然後用比它多一位的九位數10000000 減去234的二進位制形式就是-234的儲存形式。

也就是傳說中的:取反加一

程式設計練習:
一年大約有3.156*10^7秒。程式設計提示使用者輸入身高,然後以釐米為單位顯示身高

#include<stdio.h>

int main(int argc, char const *argv[])
{
	long double a = 3.156e7;
	long double minutes ;
	int age;
	scanf("%d",&age);
	minutes = a * age;
	printf("%Le\n", minutes);	
	return 0;
}