您的位置:首页 > 编程语言 > C语言/C++

[C关键字]介绍第四弹—— signed、unsigned

2014-11-01 18:16 288 查看
第2篇:
signed、unsigned
有没有符号――signed、unsigned关键字
我们知道计算机底层只认识0、1.任何数据到了底层都会变计算转换成0、1.那负数怎么存储呢?

肯定这个“-”号是无法存入内存的,怎么办?很好办,做个标记。把基本数据类型的最高位腾出来,用来存符号,同时约定如下:最高位如果是1,表明这个数是负数,其值为除最高位以外的剩余位的值添上这个“-”号;如果最高位是0,表明这个数是正数,其值为除最高位以外的剩余位的值。

 

我们的signed关键字也很宽恒大量,你也可以完全当它不存在,编译器缺省默认情况下数据为signed类型的。

 

然而,负数并不仅仅是简单的以符号+数据存储的。而是通过一种叫做补码的形式来存储。补码就是通常所说的:按位取反再加一。为什么要这样设计呢?

 

为什么要用补码?

      下面我来解释一下为什么补码可以实现减法当做加法。

       我们假设一个数字A,它的正数表示,我们称为”正”,它的相反数,我们称为”负”,我们知道:

       负 +正
= 0

在计算机做加法的时候,如果最高位(符号位)有进位,则进位被舍弃。我们可以利用溢出,来让两个数相加结果变成0。(这里假设只有1个Byte)

       负 +正
= 1 0000 0000 (这里是二进制表示)

       这里,如果1这个位置是溢出了,因此计算机直接丢掉最高位1,变成:

       负 +正
= 0;

       我们假设,数字A的正数表示形式按位取反结果为”反”,很容易知道:

       正 +反
= 1111 1111

       正 +反
+ 1 = 1 0000 0000

       右边会丢弃最高位,变成

       正 +反
+ 1 = 0

       结合公式

       正 +负 
= 0

       得到:

负 =反 + 1;

 

这就是负数的按位取反再加一的由来。

(学社笔试题有涉及到)

(本专题的主要内容选自《C语言深度解剖》陈正冲著,以及百度百科,还有CSDN)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息