跨平台:选择使用32/64位的数据类型

ant*_*009 3 c

我正在试验我的第一个需要在Linux Redhat 5.3和Windows XP/Vista/7上运行的跨平台应用程序.

由于某些操作系统将运行x86或64,我想知道要声明的数据类型.

我不想使用任何库来实现跨平台的可移植性; 我想先自己做实验.

如果我需要一个int,我应该声明int32或int64还是只是int?

如果我要在64位操作系统上编译并使用int32那么数据会被截断为32位值,所以我会丢失一些数据吗?

我想知道如果我在具有不同架构的不同操作系统上运行我应该如何声明.

Mar*_*n B 13

在许多64位操作系统(例如64位Linux)中,整数仍然只有32位宽; 只有long和指针是64位宽.这被称为LP64数据模型.其原因在于,在许多情况下,int不需要比32位提供的范围更多的范围,并且使用64位只会浪费内存.在64位Windows下,evens longs是32位(与32位Windows的兼容性),只有long long是64位; 这被称为LLP64数据模型.

如果您的应用程序将在32位和64位操作系统上运行,那么32位整数的范围显然已足够 - 否则,您将在32位操作系统上遇到麻烦.因此,在这些情况下继续使用整数.如果您可以识别需要64位整数范围的情况,请明确使用int64_t(定义stdint.h).为了确保您写入磁盘的二进制数据格式是跨平台,兼容使用int32_t,并int64_t明确在那些地方......但也注意潜在的排列顺序问题.

最后,在编写64位代码时,请注意指针不能在LP64数据模型中转换为int - 所以请uintptr_t改用.

如果您编写干净的代码,32位/ 64位可移植性应该几乎不是问题 - 除了我上面所写的内容之外,您还不需要了解更多内容.Windows和Linux之间的可移植性将产生更大的问题,即32位和64位之间的可移植性.

  • +1,很好的解释.但请注意,Windows不使用LP64模型(它使用LLP64).只要你的代码没有假设长度的大小(或者如果你不使用它们),这不会对你产生影响. (2认同)

GMa*_*ckG 7

如果需要整数,请键入int,等等.如果您需要假设数据类型可以容纳什么(例如,您需要它有32位),请查看stdint.h

只要你确定你没有假设数据类型可以容纳什么,你就会处于良好的状态.当你做一些假设一个数据类型的东西将持有n位时,你就会进入实现定义的土地,你需要确保它在两个平台上都能正常工作.