C語言中的有符號數和無符號整形數轉換


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;
}

 

 觀察結果,發現,確實是內存中的補碼存儲未曾改變,僅僅是解釋帶符號數和無符號數的方式改變了,(補碼解釋)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM