天天看點

計算機是如何存儲int類型的

聲明:本文的内容适用于大部分的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正序排放。這種排放方式就是位元組排序。