数据宽度和字节序

数据的宽度

数据的宽度是指数据在存储器中存储的尺寸。在计算机中,所有数据的基本存储单位都是字节(byte),每个字节占8个位(位是计算机存储的最小单位,而不是基本单位,因为在存储数据时几乎没有按位进行存储的)。其他的存储单位还有字(word)、双字(dword)和八字节(qword)。

在计算机编程中,常用的几个重要数据存储单位分别就是byte、word和dword,这几个存储单位。

单位 所占位数 所占字节数
字节(byte) 8位 1字节
字(word) 16位 2字节
双字(dword) 32位 4字节
八字节(qword) 64位 8字节

数值的表示范围

在计算机中存储数值时,也是要依据前面的数据宽度进行存储的,那么在存储数据时由于存储数据的宽度限制,数值的表示也是有范围限制的。那么byte、word 和dword能存储多少数据呢?我们先来计算一下,如果按位存储的话,能存储多少个数据,再分别来计算以上三种单位能够存储的数值的范围。

计算机使用二进制进行数据存储时,一位二进制最多能表示几个数呢?因为是二进制数,只存在0和1两个数,所以一位二进制数最多能表示两个数,分别是0和1。那么,两位二进制最多能表示几个数呢?因为一位二进制数能表示两个数,所以两位二进制数则能表示2的2次方个数,即4个数,分别是0、1、10、11。进一步地,三位二进制数能表示的就是2的3次方个数,即8个数,分别是0、1、10、11、100、101、110、111。

存储单位 十进制范围 十六进制范围 2的N次方
字节(byte) 0-255 0-FF 2的8次方
字(word) 0-65535 0-FFFF 2的16次方
双字(dword) 0-4294967295 0-FFFFFFFF 2的32次方

2的8次方是256,为什么数值只有0~255个呢?因为计算机计数是从0开始,从0到255同样是256个数,这里的2的8次方表示能够表示数值的个数,而不是能够表示数值的最大的数。
这里只给出了无符号整数的表示范围,那么什么是无符号呢?数值分为有符号数和无符号数,有符号数是分整数和负数的,而无符号数值有整数没有负数。负数在计算机中的表示有符号数时借助了最高位来进行,如果最高位是0,那么就是整数,如果最高位是1则是负数。关于有符号数和无符号数不必过多地纠结,因为计算机表示数据是不区分有符号还是无符号的,有符号还是无符号是人在进行区分。

有符号数和无符号数

数学中的数据分为正数和负数,在计算机中我们分为无符号数和有符号数,无符号数表示全是正数,有符号数表示有正数和负数。这里好比将容器贴个标签,将它贴上“无符号数”的标签,那么它里面都是正数。如果它的标签是“有符号数”,那么它里面的数据可能是正数也是负数。它里面的电路数量是一定的,它能表示的开关组合也是一定的,那么它到底是按无符号数看还是有符号数看,关键在于它标签是什么。

如下图,数据宽度为4的容器能存储的数据转换为十六进制为“0~F”,使用一个圆球表示

无符号数表示范围:0 1 2 3 4 5 6 7 8 9 A B C D E F,箭头方向表示增加方向 有符号数:
正数表示范围:0 1 2 3 4 5 6 7

负数表示范围:-1 -2 -3 -4 -5 -6 -7 -8(从半圆F起到8,所以F表示-1,8表示-8)

无符号数不难理解,而有符号数则是从中间一分为二,左边为负数,右边为正数。同一个圆把它看成无符号数它是一个正数,如果把它看成是有符号数则是有正有负。比如F,它如果是无符号数,就是15,如果是有符号数它就是-1。

字节序

字节序也称为字节顺序,在计算机中对数值的存储有一定的标准,而该标准随着系统架构的不同而不同。了解字节存储顺序对于逆向工程是一项基础知识,在动态分析程序的时候,往往需要观察内存数据的变化情况,这就需要我们在掌握数据的存储宽度、范围之后,进一步了解字节顺序。

通常情况下,数值在内存中存储的方式有两种,一种是大尾方式,另一种是小尾方式。关于字节序的知识,通过一个简单的例子就可以掌握。

比如有0x01020304(C语言中对十六进制数的表示方式)这样一个数值,如果用大尾方式存储,其存储方式为01020304,而用小尾方式进行存储则是04030201,用更直观的方式展示其区别,如表所列。

大尾方式 小尾方式
数据 地址值 数据 地址值
01 00000000H 04 00000000H
02 00000001H 03 00000001H
03 00000002H 02 00000002H
04 00000003H 01 00000003H

从两个地址列可以看出,地址的值都是一定的,没有变化,而数据的存储顺序却是不相同的。从表中可以得到如下结论。

大尾存储方式:内存高位地址存放数据低位字节数据,内存低位地址存放数据高位字节数据;

小尾存储方式:内存高位地址存放数据高位字节数据,内存低位地进存放数据低位字节数据。

通常情况下,Windows操作系统兼容的CPU为小尾存储方式,而Unix操作系统兼容的CPU多为大尾存储方式。在网络中传输的数据的字节顺序使用的是大尾存储方式。

THE END