为什么有符号数0XFFFF FFFF代表-1?

0XFFFF FFFF 如果代表一个unsigned int 数据 那么它的值就是 4 294 967 295也就是 无符号整型所能表示的最大值。 0XFFFF FFFF 如果代表一个signed int 数据 那么它的最左边的一位是1,即它必定是一 个负数。这个值是-1.  为什么? 
1.C语言里的数据在内存中的表示,数据会因为读取的方式不同而导致读取出来的结果不同。 同样的数据如果按照int和char来读,结果是不同的,如果按照有符号和无符号来读,结果也 可能不同。 
 2.C语言的数据在内存中用二进制来表示,由于无符号的数据不用腾出最左边的一位来表示正负, 正是由于多出来这一位,我们知道这相当于二进制中的把数据左移一位,扩大二倍。所以无符号 的数据能存储的数值范围要比有符号数大一倍。  3.虽然C语言把数据使用二进制在内存中表示,但是还有一点:计算机是用补码来存储数据的。 即一个数将其转换成为二进制之后还要再转换成补码,才是最终在内存中的样子。
  所以上面的问题就有了答案: 0X FFFF FFFF 如果是一个有符号的数字,因为它的最高位是1,所以这个数是个负数。简单的 在内存中的存储形式为 1111 1111 1111 1111 1111 1111 1111 1111,这个是补码,那么原码是 什么呢?根据规则我们知道将上面的数减去二进制的1,即减去0000 0000 0000 0000 0000 0000  0000 0001,得到 1111 1111 1111 1111 1111 1111 1111 1110,然后按为取反,得到0000 0000 0000 0000 0000 0000 0000 0001,这就是原码----即数字的二进制表示方式,这个数字就是-1了。



1为负  0为证
最大正数 0x7FFF    0111
最大负数 0xFFFF    1111
最小负数 0x8000     1000

你可能感兴趣的:(为什么有符号数0XFFFF FFFF代表-1?)