当前位置:   article > 正文

[C语言] 判断机器大小端_如何判断一个机器是大端还是小端

如何判断一个机器是大端还是小端

一. 什么是机器的大小端

机器大小端: 多字节数据在内存中存储的字节顺序
  • 1

大端: 数据高权值字节存储在内存的低地址处,低权值字节存储在高地址处。
(这种方式类似于我们正常阅读数值的方式,从左到右)

小端: 数据的低权值字节存储在内存的低地址处,高权值字节存储在内存的高地址处。
举个栗子:
在这里插入图片描述
注意: 这里面是以字节为单位, 而不是以bit 位为单位

口诀: 小小小
  • 1

低(小)权值字节放在低(小)地址, 那么就是小端, 不符合这种情况就是大端

二. 为什么机器要分大小端

因为他们有各自的优点
小端模式优点:

  1. 内存的低地址处存放低字节,所以在强制转换数据时不需要调整字节的内容
    (比如把int的4字节强制转换成short的2字节时,就直接把int数据存储的前两个字节给short就行,因为其前两个字节刚好就是最低的两个字节,符合转换逻辑)
  2. CPU做数值运算时从内存中依顺序依次从低位到高位取数据进行运算,直到最后刷新最高位的符号位,这样的运算方式会更高效

大端模式优点:
符号位在所表示的数据的内存的第一个字节中,便于快速判断数据的正负和大小

三. 判断机器大小端的两种方法

1. 使用指针

#include <stdio.h>
int main()
{
    int a = 0x12345678;
	char* p = (char*)&a; 
	if ((*p) == 0x12) 
	{
		printf("大端");
	} 
	else if ((*p) == 0x78)  
	{
		printf("小端");
	} 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2. 使用联合体

#include <stdio.h>
typedef union Node
{
	char c;
	int a;
}Node;
int main()
{
	Node node;
	node.a = 0x12345678;
	if (node.c == 0x12) 
	{
		printf("大端");
	} 
	else if (node.c == 0x78)  
	{
		printf("小端");
	} 
	return 0; 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

评论区欢迎指正!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/387048
推荐阅读
相关标签
  

闽ICP备14008679号