首页 > 编程语言 >C++中BigEden、SmallEden编码

C++中BigEden、SmallEden编码

时间:2023-08-06 09:44:40浏览次数:32  
标签:1234 编码 小端 BigEden int C++ 大端 256 SmallEden

基本概念

大端小端表示,一个数字在内存中或硬盘上记录时,是高位在前或在后,高位在前就是大端(BigEden),在后就是小端(samllEden)。

我们日常记录和代码里定义一千二百三四如:

int a = 1234;

就是大端记录。

如果是小端的一千二百三十四:就是"4321"了。

 

通常应用

一般而言,平台使用的大小端类型分别是:

小端:x86、ARM、win

大端:PowerPC

在操作系统上小端应用得更广泛些,但网络传输中(网络序)采用的是大端,一般系统上自带转换函数。

 

判断本机是大端还是小端

以C++ 为例

1     bool IsSmallEden (){
2         int i = 1;
3         char* p = (char*)&i;
4         bool b = (*p == 1); // == 1 说明小头
5         return b;
6     }

原理:定义一个数i=1,其占字节数为4,判断其最低位的位置是否为1,即可。为1说明低位编码放在前面了,说明是小端,否则就是大端。

Java同样,可以取int的高低位byte进行为1验证。

 

思考例题

下面打印的结果是多少呢?

1 char a[5] = "1234";
2 
3 int *ptr = (int*)a;
4 
5 printf("%x\r\n", *ptr);

 

答案解析

根据机器samllEden / bigEden类型不同打印结果不同。

行3: 将a[] 转换为了 int*,也就是说用"1234"来表示了一个本机整数编码。注意此值的实际整数值可能与我们预期较远为:

52 * (256*256*256) + 51 * (256*256) + 50 * 256 + 49 = 875770417。

其含义为 52, 51, 50, 49 分别为4, 3, 2, 1的ASCII编码,几个256相乘分别代表其在int 的4个字节中所占的编码位置,52, 51, 50, 49按顺序分别对应从高到低的4位。

PS:开始本帅也以为,1234转int后在4个字节上的编码值分别应该是1234,无非就是个高低位的区别,可实际是每个位置上是这些值的ASCII编码。

所以第五5行打印结果就是(环境win10):

34333231

34, 33, 32, 31分别为 4 3 2 1 ASCII编码的十六进制表示。

也就是说

int的实际值(就是打印值)是'4' * (256*256*256) + '3' * (256*256) + '2' * 256 + '1' "4321" ,高位是4,而实际显示字符串显示是第一行  char a[5] = "1234"; 的定义高位是1。就是我们看到的1234在内存是4321的方向,字符串定义理解为我们看到的方向,打印结果理解为实际值的方向。

另外:如果我们正常定义

int a = 1234;

print(a);

这样打印结果是正常的 1234,因为在定义和查看,我们日常默认的都是大端,在输入输出时程序里自动进行的大小端,就无需担心了。

 

标签:1234,编码,小端,BigEden,int,C++,大端,256,SmallEden
From: https://www.cnblogs.com/scarlet/p/17609086.html

相关文章

  • C++_函数模板
    函数模板》是不进行编译的,因为类型还不知道模板的实例化》函数调用点进行实例化:在函数调用点,编译器用用户指定的类型,从原模板实例化一份函数代码出来模板函数》才是要被编译器所编译的模板类型参数typename/class模板非类型参数模板的实参推演》可以根据用户传......
  • stm32用keil5新建C/C++写硬件串口模块的套路
    新建文件:写代码:就在这里开始写initSerial了..........
  • C/C++ 数据结构-直接选择排序
    #include<iostream>#include<Windows.h>usingnamespacestd;voidswap(int*num1,int*num2){inttemp=*num1;*num1=*num2;*num2=temp;}intmain(){intret[]={161,156,170,164,158,180,159,185,172,176};intlen=......
  • C/C++ 数据结构五大核心算法之贪心算法_钱币找零问题
    贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。贪婪算法并没有固定的算法解决框架,......
  • C++可重入函数和不可重入函数
    转载:https://blog.csdn.net/weixin_41969690/article/details/108006834C++可重入函数和不可重入函数可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果正确不必担心数据错误的函数。不可重入函数是指不能运行在多任务环境下,除非能保证互斥的函数。由于使用......
  • 代码随想录-字符串-c++总结
    关于字符串string一些库函数的使用,不太熟悉,导致开始做的时候比较磕磕绊绊主要用到了<algorithm>中的reverse,以及string的resize,substr,erase等,在这贴一个C++字符串(string)常用操作总结-知乎(zhihu.com)C++的string库用法总结-知乎(zhihu.com)反转字符串||中,每2k个字符进......
  • C# 如何调用C++ dll string类型返回
    这篇文章主要介绍了C# 如何调用C++ dll string类型返回问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 −目录C#调用C++dllstring类型返回C++端:(定义返回数据为结构体Vector4)C#端:(接收返回的结构体Vector4)C#调用C++dll类型......
  • C/C++ 数据结构五大核心算法之回溯法-N皇后问题
    N皇后问题:在n*n的棋盘上要摆n个皇后,要求:任何两个皇后不同行,不同列也不在同一条斜线上,求给一个整数n,返回n皇后的摆法数。#include<iostream>#include<math.h>#defineN8usingnamespacestd;intq[N+1];//q[i]表示第i个皇后在第i行上的第q[i]列intcheck(i......
  • ITK在C++文件里面,可以这样调用开旁路的函数
    问题:如果直接在c++文件引入开旁路函数POM_AM__set_application_bypass,是编译不通过的(PS:好像是因为开旁路函数是用C写的,和C++不兼容,具体也不是很懂的,有懂的大佬,可以帮忙评论解答下) 解决方法:在c++文件前面加上这行extern"C"intPOM_AM__set_application_bypass(logicalbypa......
  • C++工厂模式简易实现
    C++工厂模式简易实现引言:动态绑定是面向对象编程的重要功能,但C++目前还没有纳入标准库的反射机制,所以为了更方便的动态构造对象,使得通过配置文件的方式改变派生类对象,而不需要去修改代码,所以可以使用工厂这一常见的设计模式,来完成类对象的动态构造。基于C++11的新特性和模板,实现......