1. 程式人生 > >資料的儲存問題 —— 用原碼存還是反碼存?

資料的儲存問題 —— 用原碼存還是反碼存?

Introduction

資料的型別由各種差別(int,char),資料還有有無符號的區別,另外,不同位數的系統儲存數字的方式也不同,例如:32位系統儲存int型別的資料時用4位元組。那麼資料的型別、符號、位數之間的結合有什麼問題呢?

Problem

在32為位系統下,有如下程式碼,如何理解:

signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;

Solution

首先清楚十六進位制位和位元組的關係:一位元組是8位,一個十六進位制位是4位。

寫出a的二進位制碼,兩個十六進位制位e0表示為:1110_0000。a為有符號型別,所以為負數。

然後清楚正負數在記憶體中的儲存形式:正數直接儲存其二進位制原碼,負數儲存其二進位制原碼的補碼(除符號位外全部取反再加1)。

a為負數,所以其儲存的是補碼形式,即1110_0000是補碼,得到原碼:1010_0000,十進位制數-32。

接著清楚低位資料向高位數資料型別的轉換:有符號位則將符號位提到最前面,其他處理方法不變。

a的原碼1010_0000在32位系統中用4位元組儲存,即32位儲存:10000000_00000000_00000000_00100000。

這裡求出了a在32位系統中原碼的形式,因為其為負數,所以儲存補碼,即:11111111_11111111_11111111_11100000,

其十六進位制表示為ff_ff_ff_e0。

Summary

經分析可知,a表示的數字為-32

b表示的無符號數字為ff_ff_ff_e0

c表示的無符號數字為1110_0000,對於無符號數來說,儲存的是原碼形式,即十進位制的224。