在每个操作系统(32/64 位)中是否存在 64 位类型,并且每个编译器的大小为 64?
同样的问题也适用于 32 位类型。(应该是int?)
问题的根源是:我正在实施具有两种指令的系统:
- 32 位
- 64 位
我想写一些类似的东西:
typedef int instruction32bit;
typedef long long instruction64bit //it is not correct some system have sizeof(long long) = 128
在每个操作系统(32/64 位)中是否存在 64 位类型,并且每个编译器的大小为 64?
同样的问题也适用于 32 位类型。(应该是int?)
问题的根源是:我正在实施具有两种指令的系统:
我想写一些类似的东西:
typedef int instruction32bit;
typedef long long instruction64bit //it is not correct some system have sizeof(long long) = 128
如果您希望您的代码真正可移植,那么您可能想要 typedef 您自己的类型,并使用例如
typedef int32_t instruction32bit;
typedef int64_t instruction64bit;
这在大多数情况下都可以工作,但如果它不适用于特定的系统/编译器/任何东西,您可以添加如下操作:
#ifdef SOMEDEFINE
typedef long long int instruction64bit;
typedef int instruction32bit;
#else
typedef int32_t instruction32bit;
typedef int64_t instruction64bit;
#endif
当然,对于不支持 int32_t 和 int64_t 的每个编译器/操作系统(或其组)模型,您可能需要一个特殊的#ifdef
.
这正是所有真正可移植的代码所做的,因为无论你发现“几乎所有编译器都做 X”,如果你的代码足够流行,总会有人想用“Bob's Compiler Project”编译代码没有这个功能。当然,另一件事是让那些使用“Bob 的编译器”的人编辑 typedef 本身,而不接受“对于 Bob 的编译器,你需要这个……”补丁,这不可避免地会以你的方式发送。
正如 Carl Norum 在评论中指出的那样,在许多情况下,#ifdef
可能可以转换为 a #if
,然后使用泛型类型,例如int
and long
。
使用uint_least32_t
和uint_least64_t
。固定大小的类型uint32_t
不会uint64_t
存在于没有它们描述的确切大小的系统上。