C++ 中轉二進制時發現一個很有趣的現象

原代碼 :

轉化原理:

由於c++內是無法直接輸出數的二進制的,所以得我們自己來操作。

思路是將目標數移位與1進行&操作,來獲取各個位的0,1的值然後一一輸出。

比如:

bin(8)= 0000 1000   //8的二進制       bin(1)= 0000 0001

8 >> 7 = 0000 0000   &0000 0001   =   0  //將8的二進制右移7位

8 >> 6 = 0000 0000                             0

8 >> 5 = 0000 0000                             0

8 >> 4 = 0000 0000                             0

8 >> 3 = 0000 0001   &0000 0001   =    1

8 >> 2 = 0000 0000                              0

8 >> 1 = 0000 0000                              0

8 >> 0 = 0000 0000                              0

將他們的值一一與1(0000 0001)進行&操作 一一輸出可以得出8的二進制0000 1000

輸出:(ps:可以把BIT改值來支持更高位)

如同此圖

調試:(輸入爲8)

可以發現bin裏面存儲的都是'\0'與'\x1'!

如果我們不強制轉換(int)bin[]的話會造成同下面一樣結果。

輸出了右邊的符號


所以我們將其強制轉換爲int後輸出纔得到我們想要答案。

爲什麼不轉換會是這個結果?

大家有注意到這個語句嗎?

j = (i >> x) & 1; 

我們可以看到前面的定義j是char型 而i是int型的。我們這樣其實就是在強制轉換了。

什麼是強制轉化?

衆所周知int型在內存中佔4個字節,而char型爲1個字節。那麼我們強制轉換系統要去掉高位的3個字節。

比如進行下列操作

int x=255;

char y=(char)x;

cout << int(y) ;

輸出爲-1  (255-256)

char型數據的範圍是-128~127(256),你可以把他想象成一個圓盤,最上面是0,向右+1,向左-1,最下面是127和-128相鄰。當你將一個大於127的正數轉換時,可以理解成從零出發繞圈,最終結果就是停留的格子。

同樣的如果x爲512的話那麼會被轉化爲0。

但在這裏我們發現我還是使用了cout << int(y) 才能輸出。

我想知道的是爲什麼一定得  (int)y   才能輸出呢?

我發現0與1被轉化爲了'\0'與'\x1'。

而‘/0’是字符常量,0是整型常量。其中字符常量也可以用轉義序列來表示。

什麼是轉義序列?

在C++裏面有兩類字符不能直接使用,轉義序列泛化轉義序列

轉義序列爲\r \n \t \b等之類的(大家可以自己查查)

而我們的問題出現在這其中的泛化的轉義序列。

泛化的轉義序列的形式有兩種:

      1.\後緊跟3個八進制數(最多隻能3個,超過的算其他字符):

      如\12表示換行符,\40表示空格,\124表示大T,\1243則表示T3。

      2.\x後面緊跟着1個或多個十六進制數:

      如\xa表示換行符,\x20表示空格,\x54表示大T,由於字符只佔8位,所以最多隻能有兩個16進制位,多了會報錯。

      結論

      原來在j = (i >> x) & 1;這個語句中,我們的結果被轉化爲了'\0' '\x1'這樣轉義序列,使得我們的輸出出現了問題,所以我們需要再次強制轉化爲int型才能輸出我們想要的答案!


      如有錯誤歡迎大家指出,互相學習讓我們一起成長!

        最後附上ASCII碼錶方便大家使用(網上找的)

        部分資料參考來自

        https://blog.csdn.net/qq_50351157/article/details/110499630

        (C語言:int型數據向char型數據的強制類型轉換原理)

        https://blog.csdn.net/weixin_43744293/article/details/116520817

        (C++中的轉義序列(\r \n \t \b)和泛化轉義序列)

        更多遊戲資訊請關註:電玩幫遊戲資訊專區

        電玩幫圖文攻略 www.vgover.com