7-14 字节序(Endianness)---PTA实验C++

2024-06-02 18:20
文章标签 c++ 实验 14 字节 pta endianness

本文主要是介绍7-14 字节序(Endianness)---PTA实验C++,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述

“内存寻址的最小单位是字节”——明白。
“每个字节有唯一的编号,称为地址”——明白。
“C++中int通常为四个字节”——了解。
int x = 1;最低字节是1还是0?——纳尼?

事实上,这里有点小小分歧:

  • 多字节数据中(例如0x12345678):
    • 权重最大的字节称为:MSB,Most Significant Byte。(例中0x12所在字节)
    • 权重最小的字节称为:LSB,Least Significant Byte。(例中0x78所在字节)
  • 多字节数据中,从低地址往高地址依次存放:
    • LSB...MSB,称为小端序(LE, little-endian)
    • MSB...LSB,称为大端序(BE, big-endian)
    • 极少数CPU使用混合序(middle-endian, mixed-endian),例如0x12345678在内存中地址由低到高为34 12 78 56
    • 有些CPU对LE、BE都支持,可以切换,称为Bi-Endianness

扯远了,回来看几个例子,地址从左往右增大,那么:

|00 01 02 03 04 05 06 07|
+-----------------------+
|12 34 56 78 .. .. .. ..| BE, int32_t x = 0x12345678
|78 56 34 12 .. .. .. ..| LE, int32_t x = 0x12345678|01 00 00 00 00 00 00 00| LE: int64_t x = 1
|01 00 00 00 .. .. .. ..| LE: int32_t x = 1
|01 00 .. .. .. .. .. ..| LE: int16_t x = 1
|01 .. .. .. .. .. .. ..| LE: int8_t  x = 1|00 00 00 00 00 00 00 01| BE: int64_t x = 1
|00 00 00 01 .. .. .. ..| BE: int32_t x = 1
|00 01 .. .. .. .. .. ..| BE: int16_t x = 1
|01 .. .. .. .. .. .. ..| BE: int8_t  x = 1
  • BE便于阅读(人们写数字其实是BE风格)。网络协议多为BE,所以BE又称为网络字节序(network order)
  • LE便于类型转换。CPU多用LE模式。

任务:现在知道一些系统上变量的值、从其内存中导出的字节序列,请判断系统是否为小端序。
目的:建立字节序的概念;掌握检测字节序的方法。
提示:可用乘法、除法、位运算处理。如检测当前计算环境的字节序,可以用union提取字节序列。

输入规格
  • 由多组数据构成。每行一组,读取到EOF为止。
  • 每组由一个十进制数值开头,之后是某种计算环境保存该数值的int32变量由低到高导出的4个字节的十六进制数值。
输出规格
  • 判断该环境的字节序,小端序输出LE,如不符合小端序但符合大端序输出BE,否则输出UNKNOWN
样例输入
67305985 01 02 03 04
67305985 04 03 02 01
67305985 03 04 01 02
样例输出
LE
BE
UNKNOWN
样例解释
  • 第1组:小端序,输出LE。
  • 第2组:大端序,输出BE。
  • 第3组:既不是小端序、也不是大端序,输出UNKNOWN。这是个混合序的例子(mixed-endian)

二、实现思路

1、利用hex函数将输入的value值转为16进制,同时利用setw(8)<<setfill('0')将不够的位补0

2、利用stringstream流接收转为16进制的value串ss<<hex<<setw(8)<<setfill('0)<<value;

3、转为字符串数组两个两个存储

!!!测试样例中的67305985转为16进制就是04030201

三、完整C++代码实现

#include<iostream>
#include<cstdint>
#include<sstream>
#include <iomanip>
#include<string>using namespace std;
void Endian(uint32_t value,string s[4]) {stringstream ss;ss << hex << setw(8) << setfill('0') << value;string hex_str = ss.str();string f[4];for (int i = 0; i < 4; i++) {f[i] = f[i] + hex_str[2 * i] + hex_str[2 * i + 1];}if (f[0] == s[0] && f[1] == s[1] && f[2] == s[2] && f[3] == s[3]) {cout << "BE" << endl;} else if(f[0] == s[3] && f[1] == s[2] && f[2] == s[1] && f[3] == s[0]) {cout << "LE" << endl;}else{cout<<"UNKNOWN"<<endl;}}
int main(){uint32_t value;string str[4];while(cin>>value){cin>>str[0]>>str[1]>>str[2]>>str[3];Endian(value,str);}return 0;
}

四、测评详情

这篇关于7-14 字节序(Endianness)---PTA实验C++的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024730

相关文章

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝