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

第2篇:

signed、unsigned

有没有符号――signed、unsigned关键字

我们知道计算机底层只认识01.任何数据到了底层都会变计算转换成01.那负数怎么存储呢?

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

 

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

 

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

 

为什么要用补码?

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

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

       + = 0

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

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

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

       + = 0;

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

       + = 1111 1111

       + + 1 = 1 0000 0000

       右边会丢弃最高位,变成

       + + 1 = 0

       结合公式

       +  = 0

       得到:

= + 1;

 

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

(学社笔试题有涉及到


本专题的主要内容选自《C语言深度解剖》陈正冲著,以及百度百科,还有CSDN)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值