哎呀, 首先为自己的空间开张庆祝一下吧`` 还挺开心的, zqynux 这名字儿没人用, 以后我就用这名字了, 一个呢是代表我的名字, zqy, 后面nux就和 Linus 的Linux 一样的, 属于自恋的类型吧.. 如果以后我就机会写操作系统的话, 一定要叫zqynux... 好了废话不多说了, 创建这个博客就是想写一些学习时的经验和发一下以前的问题..
以前学C, 反码补码就是不知道什么意思, 今天看了汇编的书才搞懂``
首先呢, 说一下现在不怎么用的一点东西, 在以前有符号的数字有三种表示方法, 一种是比较常见的, 把第一位作为符号位(最高位), 然后如果第一位是0的话, 代表正数, 1的话代表负数`. 我先举个例子啊,, 比如 -1的表示方法是(以8位数字为例.) 10000001 这就是-1的表示方法, 第一个1就是符号位. 这种表示方法有一个致命的缺点, 有两种方法可以表示0(00000000, 10000000), 你可以分别叫他们正零和负零(+0, -0), 这种表示在编程的过程中会很难处理`
好, 继续说第二种表示方法,, 那就是反码, 我觉得这个根本没必要说明的, 还是说一下吧, 毕竟是历史产物, 而且跟第三种, 也就是现在最常用的一种二进制表示方式有关系.. 反码, 顾名思义, 就和它的名字一样..反''''码嘛`` 就是反过来, 还是用-1的表示方式来做说明.. -1 前面说了, 在以前的表示方法中, 它的二进制是: 10000001 反码就是 01111110.. 这就是反码, 聪明的人肯定看出来了, (你没看出来也不一定说明你是蠢咯, 但是不认真是肯定的`) .一样的有两种对0的表示方法..
所以就出现了第三种表示方法, 补码. 补码是现在最常用的一种表示方法, 它通过使用简单的技巧使用正数来表示负数, 解决了第一种和第二中表示方法的运算问题` 依然拿-1开刀(别怪我啊, -1, 谁叫是你负数中最大的整数呢?), 正1在二进制中的表示方法是:00000001, 然后首先反码`` : 11111110(这是1的反码, 不是-1的, 别弄错了, 就是因为这个东西, 我以前就没搞懂,,,), 接着就是要在反码上加一 也就是 11111111. 这就是在补码的表示方法中-1的二进制.. 然后大家在考虑一下0的二进制表示方法(-1啊, 我用你兄弟开刀了, 开心点了吧?), 它在二进制中的表示方法是00000000, 这里没有什么+0和-0了, 前面说了是使用正数来表示负数, 没有说0, 因为在补码中00000000的反码是11111111, 然后+1就是00000000了`.
然后小提一下, 其实补码也可以用负数来表示正数, 比如 -1的二进制是 11111111(上面说了的), 首先反码00000000, 接着加一, 就是00000001了`
还有一个问题,原来的-0去哪里了? 原来-0的二进制是怎么表示的? 1000000 对吧, 看样子这个数是个负数, 但是就像前面所说的, 0只有一个` 那这个是什么呢? printf("%d", 0x80); 输出看看吧`` 就是这个原因, 所以有符号8位数能够表示-128~127 之间的数`
哎呀, 写着玩意儿累死我了, 大家如果有收获的话, 不留言就对不起我了, 更对不起被开了几次刀的-1了`如果是没有看懂的话, 更加要留言, 因为我自己看书, 脑子里的问题一大堆, 因为书上介绍的不够详细, 细节没有说明, 我怕我这里还有没有说明的细节, 所以请大家把问题也指出来``! 一是帮助以后会看这篇文章的人, 更加是帮了我自己`` (*^__^*) 嘻嘻……..
顺便给大家推荐一个工具, WIndows 自带的计算器, 在查看菜单下选择"科学型" 这个计算器挺好用的, 很方便, 在转换进制之间很灵活` 大家试着尝试一下``