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。