最近遇到乙個關於c++ float型別表示和顯示的問題: link,過程中需要檢視變數對應的記憶體區域的bit形式。
主要有下面的兩種方法:
直接使用c++中的bitset容器:這種方法比較簡單,我們使用的是已經封裝好的容器,直截了當;
使用unsigned char型別變數:這一種我們需要自己清晰地知道變數在記憶體中的儲存形式(小端儲存/大端儲存);
下面分別介紹兩種方法。
1 bitset
先看**:
#include #include using namespace std;
namespace util
}int main()
對應的輸出:
00000000000000000000000000000010請按任意鍵繼續. . .
這種形式比較簡單,直接使用bitset容器的相關方法就可以了。
2 unsigned char
同樣直接上**:
#include using namespace std;
void char2bin(unsigned char);
void show_bytes(unsigned char*, int);
void show_bytes(unsigned char* start, int len)
printf("\n");
}void char2bin(unsigned char tmp)
else
}cout << data.c_str() << endl;
}int main()
對應的輸出結果是:
1 1 1 00000001
0 0 0 00000000
2 2 2 00000010
0 0 0 00000000
0 0 0 00000000
0 0 0 00000000
cd cd ffffffcd 11001101
cc cc ffffffcc 11001100
8c 8c ffffff8c 10001100
3f 3f 3f 00111111
9a 9a ffffff9a 10011010
99 99 ffffff99 10011001
99 99 ffffff99 10011001
99 99 ffffff99 10011001
99 99 ffffff99 10011001
99 99 ffffff99 10011001
f1 f1 fffffff1 11110001
3f 3f 3f 00111111
請按任意鍵繼續. . .
**上不難理解,但是有一些細節需要注意:
注意區分小端儲存 (低位元組儲存在低位址)和大端儲存 (低位元組儲存在高位址),我當時的編譯環境是小端儲存,所以最先顯示的資料(低位址),對應的是低位元組,應該放在後面 (第一種方法bitset其實已經幫我們做好了這件事情);
在獲取二進位制表示的時候,用於右移的mask需要是無符號的unsigned char,如果是char(signed char)右移的時候會產生多個1;
printf函式在解析unsigned char和char的時候,會進行高位拓展,如果是char,且符號位為1的時候,printf輸出高位會出現ffffff,詳細可以參考: link,關於符號拓展和零拓展可以參考: link。
C 中的記憶體區域
常量資料 常量資料區域主要用於儲存字串以及其他在編譯期就已經知道值得資料。例項化的物件不能儲存在這個區域。在程式的整個生存期內,這個區域中的所有資料都有效,而且都是唯讀的,對這些資料進行修改的結果在c 中是沒有定義的。一部分原因是編譯器可能會對常量資料的基本儲存格式進行任意的優化。例如,在某個特定的...
C 程式的記憶體區域
在c 中程式的記憶體區域,可以分為四大部分吧 區 全域性資料區 堆區 棧區。區 顧名思義它就是存放我們所打的 的放置區啦。全域性資料區 存放程式的全域性資料和靜態資料全域性資料 它有個關鍵字extern就是宣告全域性量的 include using namespace std extern int ...
C 中記憶體區域的劃分
那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。那些由new或者malloc分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動 ...