c语言的高字节,c字节序_12148490的技术博客_51CTO博客

1. 高低字节

1一个16位(双字节)的数据,比如0xFF1A(16进制)

那么高位字节就是FF,低位就是1A

2. 如果是32位的数据如,0x3F68415B

高位(不是字节)3F68

低位(不是字节)415B

左边是高位,右边是低位

3. c语言中的高位字节和低位字节

如果用内存中的两个字节表示一个16位的数,

0000 0000 0000 0001  最后一个他表示的范围   1

0000 0000 0000 0010  倒数第二个他表示的范围 2*1

0000 0000 0000 0100  倒数第三个他表示的范围 2*2*1

以此类推

那么其中一个字节存放最低的8位有效位,另一个存放最高的8位有效位,

存放最低的8位有效位的字节被称为:最低有效位字节或低位字节

存放最高的8位有效位的字节被称为:最高有效位字节或高位字节

高位字节                 低位字节

↓--------------------------↓ ↓---------------------------↓

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

4. 栈的生长方向

从图中看 a的地址是大于b的地址

6e6b36b9baa505be628a035634e1fdfc.png

5. 大端法和小端法

小端法: (Little-Endian) 高高  低低

低位字节放在内存低地址 即为该值起始地址, 高位字节排放在内存的高位地址端。

大端法: (Big-Endian)  高低  低高

高位字节放在内存的低地址端即该值的其实地址, 低位字节排放在内存的高地址端。

0x12345678 在栈中

int a = 0x12345678;

printf("%x\n", *((char*)&a + 0));//78   低位 字节        低地址

printf("%x\n", *((char*)&a + 1));//56

printf("%x\n", *((char*)&a + 2));//34

printf("%x\n", *((char*)&a + 3));//12   高位 字节       高地址

16e2aaaf00ca9b2a43505ce3269f6645.png

所以他默认使用的是小端法,低位字节 放低地址作为起始点.

小端法表示图

dfc4d70b56b07bf32a780da45b73cc19.png

大端法表示图

7f318f4e407b59a5a9a675618ae7048c.png

6. 网络字节序

网络上的数据流是字节流,对于一个多字节的数值,在进行网络传输的时候,应该先传哪个字节,

当接收端收到第一个字节时候,他是将这个字节作为高位还是低位呢?

网络字节序的定义:收到的第一个字节被当做高位看待,这就要求发送端发送的第一个

字节就是高位, 而在发送端发送数据的时候,发送的第一个字节是该数字在内存

的其实地址对应的字节,  那这样的话,首先要发送高位,起始地址放高位的就是:大端法。

网络字节序说的就是   大端法字节序

如0x12345678这个×××,在X86平台下,他默认就是小端法存放的,在发送前

需要使用API将他转换成大端法存放,int a = 0x12345678;

printf("%x\n", *((char*)&a+0));   78

printf("%x\n", *((char*)&a + 1));  56

printf("%x\n", *((char*)&a + 2));  34

printf("%x\n", *((char*)&a + 3));  12

//转换成网络字节序

a = htonl(a);

printf("%x\n", *((char*)&a + 0)); 12

printf("%x\n", *((char*)&a + 1)); 34

printf("%x\n", *((char*)&a + 2)); 56

printf("%x\n", *((char*)&a + 3)); 78

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值