c语言中为什么-0177777要转换成原码真值是-1。0123就不用转换,真值是83
整数有正整数和负整数,为了表示负数,一般用最高位来表示符号,因此,最高位是不能用来表示数值的。所以,一个16位的整数最大值为:
2^15=32767(10)=7fff(16)=0111
1111
1111
1111(2),括号后面是进制。
也就是除去最高位,用来保存数值的位数是总位数-1,也就是15位。
而用1代表负数,0代表正数,按理,最小负数就应该是最高位设1:
ffff(16)=
-
32767
=
1111
1111
1111
1111(2)
但是这样的话,0值就有正负之分了,但数学上0是中性的没有正负之分,那么假如保留正0代表0,另一个,也就是1000
0000
0000
0000(2)就浪费了。因此编码专家采用补码表示法来表示负数,而正数保留原来的编码形式,叫做原码表示法。
补码是在原码基础上按位取反+1,也即:
取-32767的绝对值,也即去符号为32767(10)=7fff(16)=0111
1111
1111
1111(2)
按位取反:1000
0000
0000
0000(2)
+1:1000
0000
0000
0001(2)
转换成16进制就是:8001
打印输出时,由于最高位为1,因此系统认为是负数,就按补码解码,输出为
-32767。
再来看看
-1
取-1的绝对值后的为1(10)=0001(16)=0000
0000
0000
0001(2)
按位取反:1111
1111
1111
1110(2)
+1:1111
1111
1111
1111(2)
转换成16进制:
ffff
同样打印输出时按补码解码,输出为-1
可见负数的绝对值越小(比如1),补码数值部分越大(7fff),绝对值越大7fff,补码数值部分越小0001,使得编码与原码的编码相反。这样,负0编码就可以看做
-32768了,把负0编码利用起来了。
验证一下
-32768:
取-32768的绝对值为32768(10)=8000(16)=
1000
0000
0000
0000(2)
按位取反:
0111
1111
1111
1111(2)
+1:1000
0000
0000
0000(2)
转换成16进制:8000
如果不用补码表示而是用原码表示负数数值,那么编码1000
0000
0000
0000(2)表示的是负0,且负数端最小值为
-32767,而采用补码表示,负0这个编码可以利用起来用来表示-32768。使得整数范围增加了1,达到-32768-
+32767
,不浪费编码空间。
五年级语文课本的东西
五年级语文课本第二单元词语盘点:
幽芳 漂泊 惟独 顿时 慈祥 稀罕 离别 大抵 精神 品格 灵魂 骨气 民族 气节 磨难 欺凌 境遇 毕竟 所谓 梳理 衰老 珍藏 手绢 华侨 能书善画 风欺雪压 顶天立地 低头折节
玷污 秉性 眷恋 姿态 迷人 至少 邻居 成熟 完整 尤其 提前 潺潺 婀娜 舞姿 粼粼波纹 干涸 点缀 螃蟹 浮现 潮湿 流通 舒服 印象 冷飕飕 颇负盛名香飘十里 守望相助
实数大小的比较;正数()0,0()负数,正数()负数;两个负数,绝对值()
正数(>)0,0(>)负数,正数(>)负数;两个负数,绝对值(大的反而小)