二進位制資訊表示

2022-05-05 08:15:10 字數 4441 閱讀 4392

就是普通 的乙個整數(可能為負數),這個整數占用4個位元組空間

如何儲存到char型別的字元型陣列裡面,再按照單個位元組讀取的形式,在電腦本地,將資料讀取出來。

比較簡單粗暴的方法:

1.迴圈讀取,每次把整數的最小8位存進去,然後右移8位。

比較直接的方法就是:

char chrarr[10];

int intval;

*((int*)chararr) = intval;

我寫了如下**進行測試:

char chrarr[20];

int intval = 1234;

*((int *)chararr) = intval;

printf("%c", chrarr[0]);

printf("%c", chrarr[1]);

printf("%c", chrarr[2]);

printf("%c", chrarr[3]);

輸出如下:

◆ 請按任意鍵繼續...

將上述**中的所有chrarr的元素,按照%d的格式輸出,結果是:

-46400請按任意鍵繼續...

可以看到,這仍然不是我們想要的結果,可以推斷出,其實是由於負數的緣故。

將上述**中的%c,替換成%u,輸出結果是:

4294967250400請按任意鍵繼續...

此時結果仍然是不對的,chrarr要轉型,考慮到按照位元組解析,排除負數的干擾,這裡直接用unsigned char陣列

於是,上述**,最終變為:

int a = 1234;

char ch[100];

unsigned char chrarr[20];

int intval = 1234;

*((int *)chararr) = intval;

printf("%u", chrarr[0]);

printf("%u", chrarr[1]);

printf("%u", chrarr[2]);

printf("%u", chrarr[3]);

否則,需要將chrarr轉型,也就是用(unsigned int)chrarr[0]

此時,輸出結果為:

210400請按任意鍵繼續...

4*256+210 就是1234

進一步解釋一下,就有下面的式子a:

210 + 4256 + 0256256 + 0256256256

int val = *((int*)chrarr));
上面的**,現在這個只是陣列轉成乙個整數值

此處一定要吸取經驗教訓:

就是不要老是自己看書,要結合實踐,要自己手寫**來測試各種情況。

下面來解釋上面的式子a是什麼意思:

256就是2的8次方,乙個位元組占有8位(也就是8個bit),乙個整數就是4個8位的字元。

那分成4個8位,

高位是不是要乘以乙個分量?

4個8位的數相加最多才1024.

此處可能有點難理解,因為正常我們轉進製,都是乘以2,8, 10, 16的

可以這樣想:

256其實就是就是256進製

100分成兩位數可以怎麼分?

其實是 10, 0,

1010 + 010

相當於0乘以10的0次方 加上 10 乘以 10 的平方

10進製表示法,每個數字最大10,

二進位制:

10000000 10000001這兩個二進位制分開存

合起來的時候就可以看作是直接相加, 1000000010000001這個就是結果。

10000000*256 + 10000001

乘以256就是左移8位,

10000000 << 8 + 10000001

把乙個整數拆開4個存,本來是百位的都變成個位了,恢復的時候,百位要變百位

如果上面的二進位制沒有看懂,可以看下面的解釋:

合起來的意思:其實就是原始的值:

1000000010000001就是原始值

拆分完以後,就變成了兩部分。

一共是16個bit

也就是拆分為兩部分的後的結果為:

10000000 10000001

那麼用什麼運算,可以將上面這左右兩部分數合成結果?

相加可以嗎?

當然直接相加肯定是不行的。

需要將左邊的數,左移8位,然後再相加,

將左邊的部分左移8位,那麼右邊的部分就要補0

10000000向左移動8位,那麼得到的結果就是

1000000000000000

乘以256,其實就相當於向左移動8位

說白了,你直接寫<< 8也可以

然後整數是32位,

所以,要有左移24,16,8位

32位數字,最高8位拿出來

左移24位,是不是就是剛好在最高位

11000000 10000001 10000000 10100000 這是乙個32位的整數

11000000 左移24位得到11000000000000000000000000000000

加上10000001左移16位得到100000010000000000000000

再加上10000000左移8位得到1000000000000000

再加上10100000左移0位得到10100000

將上述【得到】字樣後面的數相加,

看是不是組成32位數字了

也就是移完24位加移完16位

11000000000000000000000000000000

加。 100000010000000000000000

11000000000000000000000000000000

加。 100000010000000000000000

加1000000000000000

11000000000000000000000000000000

加。 100000010000000000000000

加1000000000000000

11000000000000000000000000000000

加。 100000010000000000000000

加1000000000000000加再加10100000

得到如下結果

那麼問題來了,11000000100000011000000010100000這個要怎麼拆成4個8位數字?

取這個數的最低8位,就是10100000

11000000100000011000000010100000然後這個右移動8位再取最低8位

110000001000000110000000這個是移完8位的然後再取最低8位

直到整個數字移完

這個過程就是拆分

組合的過程你知道了,就是上面說的。

因為是字元型陣列,陣列0元素的最大範圍就是255

1234存不進陣列中

那結果怎麼儲存1234

除非陣列0存12

已知,整數1234的二進位制表示位:

100 1101 0010

也就是,整數1234的二進位制表示是:

0000 0000 0000 0000 0000 0100 1101 0010

也就是,占用了char型別陣列的4個元素

char ch[4];

char chrarr[20]

chrarr[0] 為 0000 0000

因為程式是小端程式

chrarr[1]為0000 0000

chrarr[2]為0000 0100

chrarr[3]位1101 0010

所以最低位是:1101 0010

這裡說到的小端順序就是,低位址位儲存整數的 低位,也就是陣列0號元素,儲存最小的。

陣列0存最小的,11010010

陣列1存00000010

也就是1234這個數的低8位是1101 0010在chrarr[0]內部是直接儲存的,這8位在記憶體中就是這樣直接儲存的,內部不用再考慮內部是否需要逆置順序的問題。

也就是陣列0就是11010010,

11010010的十進位制就是210

所以,你**裡看到的陣列0的結果是210

如果你按照%x進行列印,那麼,列印出來的是結果就是11010010對應的十六進製制,也就是d2

又因為,符號位是負數,大於127就是負數,210是不是大於127了?所以,除非用unsigned char這種無符號型別的

所謂符號位就是:最高位是符號位,如果最高位是0,則表示是正數;如果最高位是1,則表示是負數

本來,210存入char就是負數。

經驗:計算機無論怎麼儲存資料,都無所謂,看怎麼解析,怎麼存都是二進位制,無論是int還是char還是double,還是float,無論什麼數,本質都是二進位制。

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

二進位制數的表示

吐槽一下,今天網真慢,等了半天才進去 二進位制的表示,先舉個例項吧 一 23用二進位制表示 private sub command1 click dim n as byte n 23 const er as byte 2 dim shang as byte dim yushu 1 to 5 as b...

二進位制小數的表示

二級制小數分為兩大類 1 定點數 2 浮點數。定點數 1 小數點位置固定不變的數。2 定點數有定點整數和定點小數。定點整數 小數部分為0 定點小數 整數部分為0 定點整數的表示 規定小數點在最低有效位的後面。若為8位來表示,最高位用來表示正負號 即0與1 剩下7位為二進位制數,小數點在最低位的右邊 ...