高位字节与低位字节简单介绍

本文深入解析了16位和32位数据在计算机内存中的存储方式,包括高位字节和低位字节的概念,以及不同处理器架构(如Intel CPU)在存储这些数据时采用的大端和小端存储顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般一个16位(双字节)的数据,比如 FF1A (16进制)
那么高位字节就是FF,低位是1A

如果是32位的数据,比如 3F68415B
高位字(不是字节)是3F68
低位字是415B

右边是低位位,左边是高位

C语言中的高位字节和低位字节是什么意思?
通常我们从最高有效位(most significant digit)开始自左向右书写一个数字。在理解有效位这个概念时,可以想象一下你的支票数额的第一位增加1和最后一位增加1之间的巨大区别,前者肯定会让你喜出望外。

计算机内存中一个字节的位相当于二进制数的位,这意味着最低有效位表示1,倒数第二个有效位表示2×1或2,倒数第三个有效位表示2×2×1或4,依此类推。如果用内存中的两个字节表示一个16位的数,那么其中的一个字节将存放最低的8位有效位,而另一个字节将存放最高的8位有效位,见图10.5。存放最低的8位有效位的字节被称为最低有效位字节或低位字节,而存放最高的8位有效位的字节被称为最高有效位字节或高位字节。
高位字节 低位字节
↓--------------------------↓ ↓---------------------------↓

15 14 13 12 11 10 9. 8. 7. 6. 5. 4. 3. 2. 1. 0.

16位和32位的数是怎样存储的

一个16位的数占两个字节的存储空间,即高位字节和低位字节(见10.5中的介绍)。如果你是在纸上书写一个16位的数,你总是会把高位字节写在前面,而把低位字节写在后面。然而,当这个数被存储到内存中时,并没有固定的存储顺序。

如果我们用M和L分别表示高位字节和低位字节,那么可以有两种方式把这两个字节存储到内存中,即M在前L在后或者L在前M在后。把M存储在前的顺序被称为“正向(forward)”或“高位优先(big—endian)”顺序;把L存储在前的顺序被称为“逆向(reverse)”或“低位优先(little—endian)”顺序。

big—endian这个术语的含义是数的“高位(big end)”存储在前,同时这也是对《Gulliver’sTravels》这本书中的一个词的引用,在该书中big—endian一词是指那些从大头开始吃一个煮鸡蛋的人。

大多数计算机按正向顺序存储一个数,Intel CPU按逆向顺序存储一个数,因此,如果试图将基于Intel CPU的计算机连到其它类型的计算机上,就可能会引起混乱。

一个32位的数占4个字节的存储空间,如果我们按有效位从高到低的顺序,分别用Mm,Ml,Lm和Ll表示这4个字节,那么可以有4!(4的阶乘,即24)种方式来存储这些字节。在过去的这些年中,人们在设计计算机时,几乎用遍了这24种方式。然而,时至今天,只有两种方式是最流行的,一种是(Mm,MI,Lm,LD,也就是高位优先顺序,另一种是(Ll,Lm,Ml,Mm),也就是低位优先顺序。和存储16位的数一样,大多数计算机按高位优先顺序存储32位的数,但基于Intel CPU的计算机按低位优先顺序存储32位的数。

### 高位字节低位字节的含义及表示方法 在计算机科学中,字节是由8位组成的单位,而多位数据(如16位、32位等)则由多个字节组成。当提到高位字节低位字节时,这是指在一个多字节的数据结构中,各个字节的位置及其重要性。 #### 字节序的概念 - **大端字节序 (Big-Endian)** 是一种常见的字节排列方式,在这种模式下,最高有效字节存储在最低内存地址处,随后依次是次高有效字节等等[^1]。 - **小端字节序 (Little-Endian)** 则相反,最低有效字节被放置在最低内存地址位置上[^1]。 #### 高位字节低位字节的意义 假设我们有一个16位二进制数 `0100 0000 0000 0000` (即十六进制表示为 `0x4000`),它可以拆分为两个独立的部分: - **高位字节**:代表较高权值部分,这里是 `0100 0000` 或者说是 `0x40`; - **低位字节**:代表较低权值部分,此处则是全零状态 `0000 0000` 即 `0x00`。 因此,“高位字节为01”,实际上是说它的二进制形式可能是类似于这样的开头几位设置为了'01...';同理,“低位字节为00”意味着这部分完全由零构成[^1]。 #### 应用场景分析 这类概念广泛应用于通信协议设计之中,例如 Modbus RTU 中就明确规定了其帧格式需遵照 Big-Endian 的方式进行传输[^1]。这意味着如果设备之间交换的是双精度浮点型变量或者其他复杂类型,则双方都必须清楚如何分割这些复合类型的组成部分以便正确解读收到的消息内容。 另外值得注意的一点在于某些嵌入式系统开发过程中也可能涉及到手动操控硬件寄存器的情况,此时程序员就需要确切知道哪些位属于控制功能开关之类的“命令区域”,哪些又仅仅是保留未使用的填充空间而已[^3]。 --- ### Python 示例代码展示如何提取高低位字节 下面给出了一段简单易懂的Python脚本用于演示怎样从一个整数里分别取出对应的高字节和低字节: ```python def get_high_low_bytes(value): high_byte = value >> 8 # Shift right by 8 bits to obtain higher byte. low_byte = value & 0xFF # Mask with FF(255) to retain only lower byte. return high_byte, low_byte # Example usage: number = int('0x4000', base=16) highb, lowb = get_high_low_bytes(number) print(f"High Byte: {highb:#0{4}X}, Low Byte: {lowb:#0{4}X}") ``` 此函数接受任意大小不超过两倍目标宽度范围内的正整数值作为输入参数,并返回该数值分解后的高字节和低字节数值对。其中运用到了位运算符右移(`>>`)以及按位(&),前者负责丢弃掉不需要考虑的小数部分从而获得较大的那一半信息量,后者用来截取剩余较小的那一侧原始资料副本[^2]^。 --- ### C++ 版本实现 对于C++开发者来说也可以很容易地达到相似效果: ```cpp #include <iostream> using namespace std; void extractBytes(unsigned short val){ unsigned char hByte = static_cast<unsigned char>(val >> 8); unsigned char lByte = static_cast<unsigned char>(val & 0xFF); printf("Higher Byte:%02X\nLower Byte :%02X", hByte,lByte ); } int main() { unsigned short num = 0x4000; extractBytes(num); return 0; } ``` 在这里采用了强制类型转换(static_cast<>),确保即使面对更宽泛的数据类别也能安全准确无误地执行相应操作步骤. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值