当前位置: 首页 > article >正文

数据结构之小端和大端之谜

这些是什么? 
小端和大端是存储多字节数据类型(int、float 等)的两种方式。在小端机器中,多字节数据类型的二进制表示的最后一个字节首先存储。另一方面,在大端机器中,首先存储多字节数据类型的二进制表示的第一个字节。 
假设整数存储为 4 个字节(对于那些使用基于 DOS 的编译器,如 C++ 3.0,整数为 2 个字节),那么一个值为 0x01234567 的变量 x 将存储如下。


 

 如何在您的机器上查看多字节数据类型的内存表示? 
下面是一个示例 C 代码,显示了 int、float 和指针的字节表示。 


#include <stdio.h>
  
/* function to show bytes in memory, from location start to start+n*/
void show_mem_rep(char *start, int n)
{
    int i;
    for (i = 0; i < n; i++)
         printf(" %.2x", start[i]);
    printf("\n");
}
  
/*Main function to call above function for 0x01234567*/
int main()
{
   int i = 0x01234567;
   show_mem_rep((char *)&i, sizeof(i));
   getchar();
   return 0;
}
输出
67 45 23 01

时间复杂度: O(1)

辅助空间: O(1)

当上面的程序在小端机器上运行时,输出“67 45 23 01”,而如果它在大端机器上运行,则输出“01 23 45 67”。
有没有一种快速的方法来确定你的机器的字节顺序? 
没有。确定机器字节顺序的方法。这是执行相同操作的一种快速方法。 
 

#include <bits/stdc++.h>
using namespace std;
int main()
{
	unsigned int i = 1;
	char *c = (char*)&i;
	if (*c)
		cout<<"Little endian";
	else
		cout<<"Big endian";
	return 0;
}

// This code is contributed by rathbhupendra
输出
小端

输出: 
 

小端

时间复杂度: O(1)

辅助空间: O(1)

在上面的程序中,一个字符指针c指向一个整数i。由于当字符指针被取消引用时字符的大小为 1 个字节,它将仅包含整数的第一个字节。如果机器是小端,则 *c 将为 1(因为最后一个字节首先存储),如果机器是大端,则 *c 将为 0。字节 
序对程序员重要吗? 
大多数时候,编译器会处理字节顺序,但是,在以下情况下,字节顺序会成为一个问题。
它在网络编程中很重要:假设您将整数写入小端机器上的文件,然后将此文件传输到大端机器。除非有小端到大端的转换,否则大端机器会倒序读取文件。你可以在这里找到这样一个实际的例子。
网络的标准字节顺序是 big endian,也称为网络字节顺序。在网络上传输数据之前,首先将数据转换为网络字节顺序(大端)。 
有时使用类型转换很重要,下面的程序就是一个例子。
 

#include <iostream>
using namespace std;

int main() {
unsigned char arr[2] = {0x01, 0x00};
unsigned short int x = *(unsigned short int *) arr;
cout << x << endl;
cin.get();
return 0;
}

在上面的程序中,一个char数组被类型转换为无符号短整数类型。当我在小端序机器上运行上面的程序时,我得到1作为输出,而如果我在大端序机器上运行,我得到256。为了使程序独立于字节顺序,应该避免使用上述编程风格。


什么是双端处理器?
双端处理器可以在小端和大端两种模式下运行。
小端机、大端机和双端机的例子是什么?
基于英特尔的处理器是小端。ARM处理器是小终端。当前的ARM处理器是双向的。
摩托罗拉68K proc


http://www.kler.cn/a/4404.html

相关文章:

  • 数据结构--二叉树
  • vue中的那些事(刷新+key+v-if,v-for)
  • RabbitMQ(三)
  • Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步
  • HTML实战课堂之启动动画弹窗
  • uniapp 小程序 textarea 层级穿透,聚焦光标位置错误怎么办?
  • Vue 点击图片放大显示功能
  • 11_nginx_document_uri
  • 信息打点-主机架构蜜罐识别WAF识别端口扫描协议识别服务安全
  • 测试开发进阶系列课程
  • 问卷中多选题该怎么分析?
  • 《毫无意义的工作》笔记——一个人的工作越明显对他人有益,他得到的酬劳就越低?
  • STM32之TIM编码器接口
  • uni-app使用uview组件中的封装
  • 【笔记】C# 泛型约束
  • 【华为OD机试 2023最新 】 回文字符串(C++)
  • 基于springboot实现校园在线拍卖电商系统【源码】
  • 小波阈值去躁
  • 除了四大“门派”菌,一文了解肠道菌群的其它17个小众“门派”细菌
  • Java 线程调度
  • C语言的灵魂---指针(进阶)
  • 两数之和(力扣刷题)
  • OpenFeign调用微服务使用RequestInterceptor或@RequestHeader传递http请求头信息
  • Docker安装Redis集群(主从复制)
  • 【id:134】【20分】B. 求最大值最小值(引用)
  • 如何利用ChatGPT自动生成SQL语句