在c+中进行序列化+; 我正在阅读关于C++中的序列化的这一页。 第三个要点让我感到困惑(第一个要点是:“如果二进制数据可能被不同的计算机读取,而不是由编写它的计算机读取,那么要非常小心endian问题(little endian vs.big endian)和sizeof问题”),它还提到:“包含机器依赖项的头文件(我通常称之为machine.h)”

在c+中进行序列化+; 我正在阅读关于C++中的序列化的这一页。 第三个要点让我感到困惑(第一个要点是:“如果二进制数据可能被不同的计算机读取,而不是由编写它的计算机读取,那么要非常小心endian问题(little endian vs.big endian)和sizeof问题”),它还提到:“包含机器依赖项的头文件(我通常称之为machine.h)”,c++,C++,这些endiannes和sizeof问题是什么?(sizeof可能是一台机器上的int可以是4个字节,而在另一台机器上,例如更少的字节,对吧?) 那machine.h文件会是什么样子 互联网上是否有一些教程以一种可以理解的方式解释了所有这些事情 有时在一些源代码中,我也会遇到typedef,如: typedef unsigned long long u64_t; 它与machine.h文件有什么关系吗?大小:在一个体系结构上long在另一个32位上是64位 endianness:假设

这些endiannes和sizeof问题是什么?(
sizeof
可能是一台机器上的
int
可以是4个字节,而在另一台机器上,例如更少的字节,对吧?)

machine.h
文件会是什么样子

互联网上是否有一些教程以一种可以理解的方式解释了所有这些事情

有时在一些源代码中,我也会遇到typedef,如:

typedef unsigned long long      u64_t;
它与
machine.h
文件有什么关系吗?

大小:在一个体系结构上
long
在另一个32位上是64位

endianness:假设4字节长。4个字节在内存中可以按不同的顺序排列,比如在英特尔,最低有效位在最低地址,在摩托罗拉或sparc,顺序相反,但也可以有2301顺序的处理器。

sizeof:在一种体系结构上
long
是64位在另一种32位上


endianness:假设4字节长。这4个字节在内存中可以按不同的顺序排列,比如在英特尔,最低有效位在最低地址,在摩托罗拉或sparc,顺序相反,但是也可能有2301顺序的处理器。

有用吗?我来看看Thanks有用吗?我来看看Thanks另一种思考endianness的方式是,它就像一种语言是从左到右还是从右到左书写。这就像决定1000是1000还是0001。对于
u64\t
typedef,现代C定义了一个
头,它定义了宽度已知的整数类型。在本例中,您将对64位无符号整数使用
uint64\u t
。这填补了
machine.h
文件的角色,这是一个早期的、不可移植的约定。@Mike DeSimone:嗨,Mike,是的,也许有人可以向我解释一下为什么这个人会像我上面展示的那样做typedefs?(例如u64_t)?为什么不直接使用
int
long
等.ps。我在其他一些文件中遇到了这个类型定义,而不是“machine.h”,因为C标准本身很少说明这些类型的实际大小。我看到:
short
是1或2个字节,
int
是1、2或4个字节,
long
是2、4或8个字节。因此,这些类型没有说明编译器所针对的任何体系结构上的字节数。因此,现代C要求体系结构提供如上所述的声明大小typedef的
。你可以提供你自己的typedef(就像这位作者所做的),在
之前,这是唯一的方法,但是你必须确保它们对于你构建的每个平台都是正确的,这是一件痛苦的事情。顺便说一句,也没有要求
char
必须是8位;TI TMS5xxx DSP架构只有16位可寻址内存,因此指针指向16位值
char
short
为16位,
int
long
为32位
sizeof(char)==sizeof(short)==1
sizeof(int)==sizeof(long)==2
。编写串行驱动程序不是一个有趣的体系结构:您必须添加额外的代码,以便一次将两个字符打包到
char
中,或者浪费每个内存位置的上半部分。@MikeDeSimone:对于不允许使用1(8位)字节的short和int的范围有最低要求。虽然我听说有些平台上所有积分的大小都是1,字符位是36,但另一种理解endianness的方法是,它就像一种语言是从左到右还是从右到左写。这就像决定1000是1000还是0001。对于
u64\t
typedef,现代C定义了一个
头,它定义了宽度已知的整数类型。在本例中,您将对64位无符号整数使用
uint64\u t
。这填补了
machine.h
文件的角色,这是一个早期的、不可移植的约定。@Mike DeSimone:嗨,Mike,是的,也许有人可以向我解释一下为什么这个人会像我上面展示的那样做typedefs?(例如u64_t)?为什么不直接使用
int
long
等.ps。我在其他一些文件中遇到了这个类型定义,而不是“machine.h”,因为C标准本身很少说明这些类型的实际大小。我看到:
short
是1或2个字节,
int
是1、2或4个字节,
long
是2、4或8个字节。因此,这些类型没有说明编译器所针对的任何体系结构上的字节数。因此,现代C要求体系结构提供如上所述的声明大小typedef的
。你可以提供你自己的typedef(就像这位作者所做的),在
之前,这是唯一的方法,但是你必须确保它们对于你构建的每个平台都是正确的,这是一件痛苦的事情。顺便说一句,也没有要求
char
必须是8位;TI TMS5xxx DSP架构只有16位可寻址内存,因此指针指向16位值
char
short
为16位,
int
long
为32位
sizeof(char)==sizeof(short)==1
sizeof(int)==sizeof(long)==2
。编写串行驱动程序不是一个有趣的体系结构:您必须添加额外的代码,以便一次将两个字符打包到
char
中,或者浪费每个内存位置的上半部分。@MikeDeSimone:对于不允许使用1(8位)字节的short和int的范围有最低要求。虽然我听说有些平台上所有积分的大小都是1,字符位是