在C语言的学习中我们都知道类型分为有符号和无符号,无符号类型能够定义的最大值是有符号所定义最大值的二倍加一因为二者中都有一个0的存在所影响的。
那么负嘚最小值是怎么存储的呢这里就拿char类型来说明吧,无符号char的范围是0~255有符号的char范围是-128~127。规定是这样但是在内存是什么中-128怎么表示或者說是怎们存储的呢,代表的是-0还是-128呢
我们知道计算机在内存是什么中对数据的操作都是以补码来完成的,补码的概念:正数的补码与原碼相同,负数的补码=反码+1 反码:如果是负数,符号位是它的最高位不动其它位数值位按位取反,0变1,1变0以8位二进制为例,一字节为八比特负数的补码算法公式:1 (模) -
该数绝对值。(“模”是指一个计量系统的计数范围如时钟,时钟的计量范围是0~11模=12。表示n位的计算机计量范围是0~2^(n)-1模=2^(n)。“模”实质上是计量器产生“溢出”的量它的值在计量器上表示不出来,计量器上只能表示出模的余数任何囿模的计量器,均可化减法为加法运算)
这里以八位二进制为例进行举例说明:
-127的存储我么都知道是,127的存储是char的取值范围是-128~127,那么問题来了-128是怎么存储的,很多资料说的都是 它究竟是怎么来的呢?
可以这样理解和记忆:-128 首先它是个负数那么我们用负数算补码方式计算,得到:1 - (-128绝对值) = ; 如果这样觉得还是不靠谱不妨我们推论一下,这个推论是我借助师傅鲍老师的:
假设2:表示-128
从上面看来,一个原码对应了2个补码按照C语言的定义,在32位的系统里int表示的范围为-2^31 ~ +(2^31-1),那么可以推论出有符号数可以表示负的最大值,而没有-0的定义也就是说上面 表示的应该是-128,而不是-0