聲明:本文的内容适用于大部分的C++編譯環境,但是可能在部分環境下輸出不同。
在閱讀文章之前,請務必了解原碼,反碼和補碼的知識。
原碼:第一位表示符号,0正1負,其餘位表示二進制數值。
反碼:正數的反碼和原碼相同,負數的反碼是除符号位以外全部取反。
補碼:正數的補碼和原碼相同,負數的補碼是其反碼+1。
補碼的作用是為了友善處理負數。
printf函數中有一個參數%x,用于輸出十六進制。其中,這個十六進制中包含符号位。是以,我們輸出下面的代碼:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a=-1;
printf("%x",a);
}
輸出:ffffffff
0xffffffff就是二進制的1111111111111111111111111111111個(32個1),為-1的補碼。
我們可以把a帶入其他資料計算,研究表明,int按照補碼存儲。
補充:位元組排序
#include<bits/stdc++.h>
using namespace std;
int main(){
int a=0x12345678;
char *p=(char*)&a;
for(int i=0;i<4;i++)printf("%x",p[i]);
}
在我的環境輸出78563412。是以,int其實按照四個位元組,每個位元組逆序排放。
部分環境按照12345678正序排放。這種排放方式就是位元組排序。