"在计算机中,无符号数编码是基于传统的二进制表示法,有符号整数(包括正数和负数)是用二进制补码表示的。有符号数x的补码表示是”x的绝对值按位取反,再加1;正数的补码还是其本身
“
总是会忽略&忘记这一点。。导致刚出道时的疑问,今天还会疑问= =|||
一个字节,用二进制表示时,其值域是0000 0000 - 1111 1111,如果看成十进制整数就是0 - 255,这两种符号表示方法对于描述字节的位模式都不方便,二进制表示法太冗长,而十进制表示法与位模式的转化又很麻烦,替代的方法是,我们用16进制表示法来描述位模式,则用16进制描述一个字节的位模式就是0x00 - 0xff。
当被给了一个字节的十六进制表示时候,比如0xff,也即1111 1111,如果想知道它表示的10进制数字是什么,首先要确定我们想把它解释为有符号数还是无符号数,因为计算机把这个字节解释为有符号数和无符号数的方式是不同的,这种不同见第一段中引号中的内容。
所以,如果把这个字节解释为无符号数时候,0xff就是255(传统的二进制表示法);如果要把这个字节解释为有符号数,则这个字节的内容是其表示的有符号数的二进制补码表示。有个简单的方法判断这个有符号数是正数还是负数,就是看这个字节的最高位是0还算1,1表示负数,0表示正数。
所以,如果知道了一串二进制数字是表示的有符号数,可先根据最高位来判断是整数or负数,然后按照第一段中补码的计算,来反推其表示的十进制数字(先减1,再按位取反),已知是正数,那就是这个数字;若已知是负数,在刚才计算出的数字前面加个负号。 其实,对于正数可以简单基于传统的二进制表示法来推算其十进制的数字;负数才需要严格的按照补码计算的反过程推算。