负数补码的问题
假设一个数是 -3 ,先取整数的二进制码位 011 ,然后将所有位取反为 100 ,最后在末尾加 1 ,为 101 ,不够位时在前面补 1。 (假设占4个字节)那么为 11111111 11111111 11111111 11111101 ,那么如果得到这个数据,怎么才能知道这个是 -3 呢。
二进制11111101这个数,既可以是十进制的253,也可以是十进制的-3,到底解释为前者还是后者,视程序对int的声明而定。如果声明的是unsigned int,则表示无符号整数,它是253,如果是signed int,则是-3,因为它的高位为1。
如果声明int,结果取决于编译器的默认配置!有些编译器设置为unsigned int,有些可能是signed int,而且那是可以人为设定的。因此,编写程序时,如何理解int的值,程序员必须彻底搞清楚,有时错误就是这样造成的。那个scanf()时输入5 8得到5为大的结果,就是这样来的,得到5之后接着的数据,高位为1,被解释成负数(空格32的二进制码是100000),所以输出5为大值。