1.有符號數和無符號數的轉換
C語言允許不同數據類型之間進行強制類型轉換,同時描述一個原理:
1.計算機中數據的存儲一般都是補碼,
2.計算機在強制類型轉換的結果是保持位值不變(內存中存儲的補碼不改變),僅僅改變了數據的解釋方式
3.有符號數轉換成無符號數
1.判斷有符號數最高位是否為1,如果有符號數最高位為1,則把有符號數解釋為補碼(求真值:符號位不變,數值位取反,末位+1)
2.如果有符號數最高位為0,則直接把有符號數解釋為無符號數
4.無符號數轉換成有符號數
1.判斷無符號數最高位是否為1,如果無符號數最高位為1,則把無符號數解釋為補碼(求真值:符號位不變,數值位取反,末位+1)
2.如果無符號數最高位為0,則直接把無符號數解釋為無符號數
請觀察如下代碼:
#include "link_node.h"
#include <bitset>
using namespace std;
int main()
{
//有符號數向無符號數轉換,存儲不變,僅僅解釋方式改變
short x = 12; //帶符號短整形 2B 表示數據范圍:-32768~32767
unsigned short y = (unsigned short)x; //無符號短整形2B 表示數據范圍:0~65535
cout<<bitset<16>(x)<<endl;
cout<<bitset<16>(x)<<endl;
cout<<x<<endl;
cout<<y<<endl;
//無符號數向有符號數轉換
unsigned a = 65535;
short b = (short)a;
cout<<bitset<16>(a)<<endl;
cout<<bitset<16>(b)<<endl;
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
觀察結果,發現,確實是內存中的補碼存儲未曾改變,僅僅是解釋帶符號數和無符號數的方式改變了,(補碼解釋)