🍊 大端法和小端法

🍊 大端法和小端法

大小端法是计算机存贮数据的顺序。大端法与小端法本身并没有任何的优劣,由于发展趋势的原因(为了统一)小端法在计算机中逐渐占多数。但这并不是因为它有任何对计算机有利的优点,只是取决于早期小端法的计算机在人们的使用中推广蔓延更快些而已。目前绝大多数计算机都使用小端法,只有少部分有着特殊用途的计算机使用大端法,当然我目前也没有接触过任何大端法的计算机。甚至对于大多数的IT工程师而言大小端法在他们的日常工作中都很少考虑自己所使用的计算机使用的是那种方法。因为操作系统和编程语言已经对数据的存储做了封装,我们只需要学会编程语言存储数据的语法,而不需要考虑使用哪种方法去存储。
然而要深入了解计算机就需要了解大小端,大小端的展示用含指针的语言更好理解,用C语言GO语言分别演示一下,(只有打印出一个变量的每个字节的值才能看到大小端顺序,而只有含指针的语言才能进行指针运算,依次打印每个字节的值)
计算机的最小存储单位是位(一个位的值是0或者1),8个位又组成一个字节,而大多数数据会占用多个字节(eg:C语言中int类型占4个字节),那么这些字节的在计算机中存储的前后顺序就是所谓的大小端法

#大端法

高位有效数据放在前面的称为大端法

#小端法

低位有效数据放在前面的称为小端法

在内存中,计算机存储数据是从低位的内存地址开始存储

#C代码演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

int main(int args, char *argv []) {
int num = 122594236; // 0x12b4d6
// 转成 unsigned char 指针,char的范围是0-128,unsigned char 是0-256
unsigned char *p = (unsigned char*)&num;
// 打印
printf("address: %p, hex: %x, num: %d\n", p, *p, *p);
p += 1;
printf("address: %p, hex: %x, num: %d\n", p, *p, *p);
p += 1;
printf("address: %p, hex: %x, num: %d\n", p, *p, *p);
p += 1;
printf("address: %p, hex: %x, num: %d\n", p, *p, *p);
return 0;

/*
打印结果
address: 0x7ffee6eac4ac, hex: bc, num: 188
address: 0x7ffee6eac4ad, hex: a3, num: 163
address: 0x7ffee6eac4ae, hex: 4e, num: 78
address: 0x7ffee6eac4af, hex: 7, num: 7
由上到下地址依次增大,低位bc在前,说明用的小端法
*/
}

#GO代码演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
func TestW(t *testing.T)  {
var num int32 = 122594236 // 0x74ea3bc
d := uintptr(unsafe.Pointer(&num))
fmt.Printf("address: %p, hex: %x, num: %d\n", (*byte)(unsafe.Pointer(d)), *(*byte)(unsafe.Pointer(d)), *(*byte)(unsafe.Pointer(d)))
d += 1
fmt.Printf("address: %p, hex: %x, num: %d\n", (*byte)(unsafe.Pointer(d)), *(*byte)(unsafe.Pointer(d)), *(*byte)(unsafe.Pointer(d)))
d += 1
fmt.Printf("address: %p, hex: %x, num: %d\n", (*byte)(unsafe.Pointer(d)), *(*byte)(unsafe.Pointer(d)), *(*byte)(unsafe.Pointer(d)))
d += 1
fmt.Printf("address: %p, hex: %x, num: %d\n", (*byte)(unsafe.Pointer(d)), *(*byte)(unsafe.Pointer(d)), *(*byte)(unsafe.Pointer(d)))
}
/*
运行结果:
=== RUN TestW
address: 0xc00050b6a4, hex: bc, num: 188
address: 0xc00050b6a5, hex: a3, num: 163
address: 0xc00050b6a6, hex: 4e, num: 78
address: 0xc00050b6a7, hex: 7, num: 7
由上到下地址依次增大,低位bc在前,说明用的小端法
*/
大小端法只是计算机存储数据的一种方式,当前两台计算机用的不同的方法,通信时,要想正确读取对方的数据就需要进行数据处理了

🍊 大端法和小端法

http://itpika.com/2021/02/05/other/end/

作者

itpika

发布于

2021-02-05 09:09:12

更新于

2021-02-05 11:08:55

许可协议

评论