Winhex中有符号和无符号取值原理及在编程中的实现
做为数据恢复工程师,和我们打交道最多的莫过于各种数字了。WINHEX在数字转换方面有很强大的功能,其有一个专门的“数据解释器”,用于把16进制转换到各种有符号、无符号的值,比如无符号的32位值。如上图,可以看到WINHEX的数据解释器内容是相当丰富,在形式上支持“Big Endia”大头模式及小头模式(具体大小头的区别在论坛中找),在内容上支持有符号、无符号8位-64位的解析,并且还支持各种日期+时间的解析。
今天还是聊一聊有关其中的有符号和无符号的含义,实际上我自己对所谓的符号一直没有理解,由于平时编程中使用的无符号的多一些,所以对其本质的区别没有过多的注意。但是此次在处理一个数据库解析的时候遇到了有符号32位、48位、64位。于是乎,仔细研究了一下,网上也有这方面的专业文章,但是都比较生涩,所以不看也罢。开始前先搞清楚两个概念:
有符号 指的是取值范围中有负数比如 Shortint取值范围-128..127
无符号 指的是取值范围中无负数比如 Byte 取值范围0..255
So,Easy!看起来貌似很简单,不过实际中比想象中的有点复杂,就像这个帖子一样,剖析简单的不能再简单的基础内容(不要说看了,我甚至都不想写下去了)。关键点在于电脑和人不一样,电脑中所有一切全是基于2进制,我们平时的计算中随便写上去的“-”号在2进制中变的异常的困难。为什么?先来看下面这个16进制的值:
0XEB转换成二进制为:11101011,问题来了,怎么来表明“-”呢?因为只有单纯的0和1的组合压根体现不出来“-”号。怎么办?
我们反推一下,看看我们前辈们是如何解决这个问题的。之前说过Shortint类型的取值范围-128..127,所占用长度为1字节,那么这个类型的最大值(MAX)就是127,转换成二进制就是1111111,算下有多少个1,总共7位,怎么少了一位(1字节=8位),这1位当然没有少,而是为0,只不过WINDOWS的计算器给省略掉0了(WINHEX的数据解析器不存在此情况,会全部显示)。所以真正的最大值的2进制表示方法就是01111111。看到这里,是不是感觉到什么了?为了让我们的猜测更理性一些,再来继续看最小值(MIN)。
最小值为-128,我们来得到最小值的2进制,借助于WINHEX的数据解释器来获取。
新建一个空白长度为512字节的文件,然后在解释器中的8bit(+/-)中输入“-128”,(在WINHEX解释器中“+/-”表示为有符号),如果你在8bit(+)输入是会报错的!此时再看Binary中的值为:10000000,那么此时就得到了Shortint类型的二进制取值范围:10000000..01111111
这样我们的猜测变为了现实,所谓的有符号(即 “-”)是通过8位中的第高8位来表示的,当高8位的值为2进制 “1”时就表明为负数,而由于占用了这1位,所以最在在值也只能是01111111了,这就是其取值范围-128..127的原因。
从一个占用1字节的Shortint类型的取值范围,得到了如何表示有符号数值的原理,那就是通过查看最高位的值是否为‘1’来判断,如果为‘1’则表明是负数。这样无论是8位、16位、24位、32位、48位、64位这些值都可以通过此方法来得到解决!当然在数值转换上就会出现同一值有符号和无符号解析内容不相同的现象,因为其2进制组合是不一样的。
今天就聊到这里,下一次再聊聊如何用程序实现WINHEX数据解释器的功能. good~~~~~~~~~~~~~ 这个还要看你的属性,是一个有符号的还是无符号的。如果有符号的。最高位是1表是负数0表正数。如果是无符号的就没有正确区别了。最高位属于这个数字。比如 char a =0xff;/这里是一个有符号的是表示负数-1,而unsigned char a = 0xff;//表示无符号的数255.
谢谢分享。。。。
页:
[1]