[C语言] 判断机器大小端

判断机器大小端

  • 一. 什么是机器的大小端
  • 二. 为什么机器要分大小端
  • 三. 判断机器大小端的两种方法
    • 1. 使用指针
    • 2. 使用联合体

一. 什么是机器的大小端

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

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

小端: 数据的低权值字节存储在内存的低地址处,高权值字节存储在内存的高地址处。
举个栗子:
[C语言] 判断机器大小端_第1张图片
注意: 这里面是以字节为单位, 而不是以bit 位为单位

口诀: 小小小

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

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

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

  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("小端");
	} 
}

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; 
}

评论区欢迎指正!!!

你可能感兴趣的:(c语言)