32 位和 64 位机器中 4 字节类型的区别 Linux
Difference between 4-byte types in 32-bit and 64-bit Linux machines
我正在将我们的 Linux C++ 项目从 32 位移植到 64 位。
在我们的 32 位系统中,"long" 是 4 个字节长。但是当我们在 64 位模式下构建项目时,我们注意到 "long" 占用了 8 个字节。由于我们需要 4 字节长的类型,所以我们使用 "int" 并确认它确实是 4 字节长。我们希望我们的代码能够无缝运行。
但不幸的是没有,即使 32 位模式下的 "long" 和 64 位模式下的 "int" 都是 4 字节长,我们的代码还是失败了。
有人可以告诉我们 32 位模式下的 "long" 和 64 位模式下的 "int" 之间是否存在差异(在布局或其他方面)吗?即使两者都是 4 个字节长?
- 机器:Linux x86_64
- OS: 美分OS 6.6
- 海湾合作委员会:4.9.2
看看这个 - Size guarantees in C++。内置类型(int、long 等)满足一些最小大小,但它们不需要在每个系统上都是 4 个字节。您可以使用固定宽度的类型(如 dwcanillas 的评论中所述)。
如果您需要特定于字节长度的数据类型,请查看 cstdint
中的 int32_t
和 uint32_t
.
类型保证为给定长度,有符号和无符号。
谢谢大家。问题出在我们的代码 local/specific 上,我们假设指针的长度始终为 4 个字节。当我们取消引用它们时,我们将它们转换为 4 字节变量并且正在失去精度。这导致了崩溃。由于这是一个由许多人多年开发的大型代码库,因此有很多带有这些假设的遗留代码,我不得不检查所有指针并修改它们。最后,我们成功地将代码移植到了 64 位模式。
我正在将我们的 Linux C++ 项目从 32 位移植到 64 位。
在我们的 32 位系统中,"long" 是 4 个字节长。但是当我们在 64 位模式下构建项目时,我们注意到 "long" 占用了 8 个字节。由于我们需要 4 字节长的类型,所以我们使用 "int" 并确认它确实是 4 字节长。我们希望我们的代码能够无缝运行。
但不幸的是没有,即使 32 位模式下的 "long" 和 64 位模式下的 "int" 都是 4 字节长,我们的代码还是失败了。
有人可以告诉我们 32 位模式下的 "long" 和 64 位模式下的 "int" 之间是否存在差异(在布局或其他方面)吗?即使两者都是 4 个字节长?
- 机器:Linux x86_64
- OS: 美分OS 6.6
- 海湾合作委员会:4.9.2
看看这个 - Size guarantees in C++。内置类型(int、long 等)满足一些最小大小,但它们不需要在每个系统上都是 4 个字节。您可以使用固定宽度的类型(如 dwcanillas 的评论中所述)。
如果您需要特定于字节长度的数据类型,请查看 cstdint
中的 int32_t
和 uint32_t
.
类型保证为给定长度,有符号和无符号。
谢谢大家。问题出在我们的代码 local/specific 上,我们假设指针的长度始终为 4 个字节。当我们取消引用它们时,我们将它们转换为 4 字节变量并且正在失去精度。这导致了崩溃。由于这是一个由许多人多年开发的大型代码库,因此有很多带有这些假设的遗留代码,我不得不检查所有指针并修改它们。最后,我们成功地将代码移植到了 64 位模式。