欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

【C語言】整型的存儲方式(大小端,原碼,反碼,補碼)-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)主營南召網站建設的網絡公司,主營網站建設方案,app軟件定制開發(fā),南召h5微信平臺小程序開發(fā)搭建,南召網站營銷推廣歡迎南召等地區(qū)企業(yè)咨詢

一、基本類型

二、原碼,反碼,補碼

2.1 原,反,補的計算方式

2.1.1 正數(shù)的原,反,補

2.1.2 負數(shù)的原,反,補

2.2 為什么要用補碼存放

2.3 大小端是什么?

2.3.1 如何確定當前編譯器是那種存儲方式

2.4?signed(有符號),unsigned(無符號)

三、練習題

列1

列2

列3

END.


一、基本類型

char? ? ? ? ? ? ?//字符數(shù)據(jù)類型,用ascall碼值存儲

short? ? ? ? ? ? //短整型

int? ? ? ? ? ? ? ? //整形

long? ? ? ? ? ? ?//長整型

long long? ? ?//更長的整形

二、原碼,反碼,補碼 2.1 原,反,補的計算方式

計算機是用二進制進行各種計算

原碼,反碼,補碼是計算機進行存儲數(shù)值的編碼方式

原碼:將數(shù)值直接轉化為二進制

反碼:第一位不變其余位全部取反(原來為1,取反為0)

補碼:將反碼+1

第一位是符號位,0表示正數(shù),1表示負數(shù)

2.1.1 正數(shù)的原,反,補

具體怎樣存儲,舉個簡單的列子來說明:

int類型占用4個字節(jié),1個字節(jié)(Byte)占用8個bit位(8個二進制位),需要32個二進制位才能放得下

正數(shù)的原碼,反碼,補碼是相同的

原碼:0000 0000?0000 0000?0000 0000?0000 1010(10為正數(shù),最高位為符號位取0)

反碼:0000 0000?0000 0000?0000 0000?0000 1010

補碼:0000 0000?0000 0000?0000 0000?0000 1010

這里是用16進制進行表示,a表示10

2.1.2 負數(shù)的原,反,補

原碼:1000 0000?0000 0000?0000 0000?0000 1010(-10為負數(shù),最高位為符號位取1)

反碼:1111 1111? 1111? 1111? 1111? 1111? 1111? 0101(符號位不變其余位取反)

補碼:1111 1111? 1111? 1111? 1111? 1111? 1111? 0110(反碼+1)

(8+4+2+1=15)

由此我們可以得知在計算機中存儲時,實際上是存放的補碼

2.2 為什么要用補碼存放

計算機只會算加法,計算減法是用加一個負數(shù)來實現(xiàn)的(a+(-a))

當計算1+(-1)時

用原碼計算出的結果很顯然不是我們所期望的

用補碼計算

很顯然補碼計算的結果是正確的,所以采用補碼

2.3 大小端是什么?

細心的同志可能已經有這樣的疑問

為什么在計算機中存放數(shù)據(jù)是反著存放的?

這是因為在內存中存儲有兩種方式:1.大端字節(jié)序存儲 2.小端字節(jié)序存儲

大端字節(jié)序存儲:把一個數(shù)據(jù)低位字節(jié)處的數(shù)據(jù)存放在高地址中,而高位字節(jié)處的數(shù)據(jù)存放在低地址中

小端字節(jié)序存儲:把一個數(shù)據(jù)高位字節(jié)處的數(shù)據(jù)存放在高地址中,而低位字節(jié)處的數(shù)據(jù)存放在低地址中

如果有同志不理解什么是高位字節(jié)和低位字節(jié)

可以用十進制來類比,1234中4代表個位,1代表千位,所對應的4為低位,1為高位。

2.3.1 如何確定當前編譯器是那種存儲方式

可以取其他值進行判定,用1判斷只是我自己感覺是比較簡單的一種?

int main()
{
	int a = 1;
	char* pa = (char*)&a;
	if (*pa == 1)
	{
		printf("小端存儲\n");
	}
	else
	{
		printf("大端存儲\n");
	}

	return 0;
}
2.4?signed(有符號),unsigned(無符號)

我們在上面了解到二進制的最高位為符號位,這是因為在他們類型定義時,定義的是有符號類型,還有一種無符號類型的情況,也就是最高位不再是符號位,和其他位變得一樣。

在vs編譯器下:int,short等這些類型默認是有符號類型(signed)

雖然都是打印a,但是打印的方式卻不同

%d是十進制有符號整數(shù)打印,%u是十進制無符號整數(shù)打印

-1的補碼為:1111 1111? 1111? 1111? 1111? 1111? 1111? 1111

無符號打印就是最高位不在按照符號位處理而是正常的數(shù)值進行計算

用計算機可以算一下,確實是這樣

三、練習題 列1

答案?

解析?

int main()
{
	char a = -1;
	signed char b = -1;
	//-1原碼
	//10000000000000000000000000000001
	//反碼
	//11111111111111111111111111111110
	//補碼(計算機中存放的是補碼)
	//11111111111111111111111111111111
	//char類型占一個字節(jié)只能存放8個二進制位,多余的要進行截斷
	//a中存儲的值
	//11111111
	//因為用%d打印,%d是有符號的十進制整數(shù)打印需要32位二進制所以需要整型提升
	//整形提升(有符號類型根據(jù)符號位來添加,無符號類型用0來添加)
	//111111111111111111111111 11111111(補碼)
	//我要想看存放的是什么
	//需要將補碼轉化為原碼
	//11111111111111111111111111111111(補碼)
	//11111111111111111111111111111110(反碼)
	//10000000000000000000000000000001(原碼為-1)
	unsigned char c = -1;

	printf("a = %d b = %d c = %d", a, b, c);
	//a,b打印的值相同也可以看出char在vs編譯器下默認的是signed。
	//無符號類型在整型提升時是用0來添加,前邊的步驟是相同的就不再贅述
	//c中存放的是11111111
	//整形提升
	//00000000000000000000000011111111
	//結果為255
	
}
列2

答案

解析

int main()
{
	char a = -128;
	printf("%u\n", a);
	return 0;
}
//-128的二進制是
//10000000000000000000000010000000
//char類型只能存放8位二進制需要截斷
//存在a里的是
//10000000
//char是有符號類型,根據(jù)符號位整型提升
//11111111111111111111111110000000
//%u打印,第一位不在看作符號位
//結果為
//4,294,967,168

列3

答案

解析

char類型的取值范圍是-127~128之間,超過這個范圍會進行截斷,所以它的取值會始終在這個范圍里循環(huán)。

int main()
{
	char a[1000];
	int i;
	for (i = 0; i< 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	//
	//strlen是求字符串長度的,找的'\0'的位置,統(tǒng)計的\0之前出現(xiàn)多少個字符
	//'\0'的ASCII碼值是0
	//a[i]是從-1,-2,-3開始取值,直到取到0
	//由圖中可以看出正好是一個從0開始的逆循環(huán),127+128=255
	return 0;
}

END.

希望我的文章能給你帶來一定的幫助,最后把這句話送給大家。

The real failure is not that you have not done anything,but that you have been willing to fail.

真正的失敗不是你沒有做成事,而是你甘心于失敗。?

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

文章標題:【C語言】整型的存儲方式(大小端,原碼,反碼,補碼)-創(chuàng)新互聯(lián)
文章位置:http://chinadenli.net/article38/cohjpp.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供建站公司網站維護網站設計靜態(tài)網站網站排名虛擬主機

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

外貿網站建設