目錄
創(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.
二、原碼,反碼,補碼 2.1 原,反,補的計算方式char? ? ? ? ? ? ?//字符數(shù)據(jù)類型,用ascall碼值存儲
short? ? ? ? ? ? //短整型
int? ? ? ? ? ? ? ? //整形
long? ? ? ? ? ? ?//長整型
long long? ? ?//更長的整形
2.1.1 正數(shù)的原,反,補計算機是用二進制進行各種計算
原碼,反碼,補碼是計算機進行存儲數(shù)值的編碼方式
原碼:將數(shù)值直接轉化為二進制
反碼:第一位不變其余位全部取反(原來為1,取反為0)
補碼:將反碼+1
第一位是符號位,0表示正數(shù),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ù)值進行計算
用計算機可以算一下,確實是這樣


答案?

解析?
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

答案

解析
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;
}希望我的文章能給你帶來一定的幫助,最后把這句話送給大家。
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)