一直会困惑的问题= =|

"在计算机中,无符号数编码是基于传统的二进制表示法,有符号整数(包括正数和负数)是用二进制补码表示的。有符号数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,再按位取反),已知是正数,那就是这个数字;若已知是负数,在刚才计算出的数字前面加个负号。 其实,对于正数可以简单基于传统的二进制表示法来推算其十进制的数字;负数才需要严格的按照补码计算的反过程推算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值