数据宽度和字节序

数据的宽度

数据的宽度是指数据在存储器中存储的尺寸。在计算机中,所有数据的基本存储单位都是字节(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多为大尾存储方式。在网络中传输的数据的字节顺序使用的是大尾存储方式。

上一篇 进制及进制的转换
下一篇 ACSII码
applek

applek管理员

个人说明在个人中心里面设置

本月创作热力图

2026年3月
最新评论
hfloke
hfloke
3月1日
新版本安装更新后,页面有问题哦
丙氨酸
丙氨酸
2月27日
测试
评论于关于本站
RiseForever
RiseForever
2月23日
听说新主题发布了,来测试下评论区。
李贰捌
李贰捌
12月25日
AI摘要打开了,对接的阿里云,测试成功,但是前台为什么不显示?
javac
javac
12月8日
redis和memcached的完整支持有排期嘛?