C语言允许我们定义有符号数和无符号数,例如一个字节的存储空间,我们可以定义成unsigned char,也可以定义成signedchar,但是你知道它们的区别吗?你知道它们是怎样被存储,又怎样被区分处理吗?
1.有符号数和无符号数的存储
对于一个字节的存储单元unsigned char的范围为(0 - 255),它的存储方式就是把一个十进制的数转化为二进制的数保存起来,没什么说的。重点在于signed char的处理。
对于一个字节的存储单元signed char的范围为(-128 - 127)。它的存储方式是“编译器以补码的形式存储”。举个例子,一个字节的存储空间存放了一个数据84h,有符号数存储为-124。
我们再看这样两个定义“ unsigned char a=132”和“signed char b=-124”。在调试模式下,可以看到a、b内存单元中的数据都是84h。
结论:利用C语言定义的有符号数和无符号数,计算机本身是不能区分的,它所能做的就是存放一个二进制数据,如此而已。
2.有符号数和无符号数的处理
区分这些数据类型的工作是交给了编译器来完成;曾经那个编译器还未诞生的年代,这个工作就交给人来完成(猜想)。至于有符号数和无符号数的计算问题,因为指令是不会区分有符号或者无符号,所以这是需要编译器来通过编译出一系列指令完成有符号计算或者无符号计算。