-128在内存中如何存储

在C语言的学习中,我们都知道类型分为有符号和无符号,无符号类型能够定义的最大值是有符号所定义最大值的二倍加一,因为二者中都有一个0的存在所影响的。
那么负的最小值是怎么存储的呢,这里就拿char类型来说明吧,无符号char的范围是0~255,有符号的char范围是-128~127。规定是这样,但是在内存中-128怎么表示或者说是怎们存储的呢,1000 0000代表的是-0还是-128呢?

我们知道计算机在内存中对数据的操作都是以补码来完成的,补码的概念:正数的补码与原码相同,负数的补码=反码+1 。 反码:如果是负数,符号位是它的最高位不动,其它位数值位按位取反,0变1,1变0。以8位二进制为例,一字节为八比特,负数的补码算法公式:1 0000 0000(模) - 该数绝对值。(“模”是指一个计量系统的计数范围。如时钟,时钟的计量范围是0~11,模=12。表示n位的计算机计量范围是0~2^(n)-1,模=2^(n)。“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。)
这里以八位二进制为例进行举例说明:
比如:
-1补码:1 0000 0000 - 0000 0001 = 1111 1111;
-3补码:1 0000 0000 - 0000 0011 = 1111 1101;
-127的存储我么都知道是1111 1111,127的存储是0111 1111,char的取值范围是-128~127,那么问题来了,-128是怎么存储的,很多资料说的都是 1000 0000,它究竟是怎么来的呢?
可以这样理解和记忆:-128 首先它是个负数,那么我们用负数算补码方式计算,得到:1 0000 0000 - 1000 0000(-128绝对值) = 1000 0000; 如果这样觉得还是不靠谱,不妨我们推论一下,这个推论是我借助师傅鲍老师的:
假设1:表示-0。
那么 -0的补码: 1 0000 0000 - 0 =0000 0000
反码: 1111 1111 (0000 0000 -1 = 0000 0000 +1111 1111=1111 1111)
原码: 1000 0000(反码取反)

假设2:表示-128。
-128的补码: 1 0000 0000 - 1000 0000(+128没有符号位)= 1000 0000
反码: 1111 1111 (1000 0000 -1 =1 000 0000 + 1111 1111 = 1111 1111)(补码-1)
原码: 1000 0000(反码取反)
从上面看来,一个原码对应了2个补码。按照C语言的定义,在32位的系统里,int表示的范围为-2^31 ~ +(2^31-1),那么可以推论出有符号数可以表示负的最大值,而没有-0的定义。也就是说上面1000 0000 表示的应该是-128,而不是-0。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值