每个操作系统(32/64位)是否有64位类型,并且每个编译器的大小为64?
同样的问题也适用于32位类型。 (它应该是int?)
问题的根源是:我正在实施有两种指令的系统:
我想写一些类似的东西:
typedef int instruction32bit;
typedef long long instruction64bit //it is not correct some system have sizeof(long long) = 128
答案 0 :(得分:7)
答案 1 :(得分:3)
如果您希望您的代码真正可移植,那么您可能想要键入自己的类型,并使用例如
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的每个编译器/ OS(或其组)模型,您可能需要一个特殊的#ifdef
。
这正是所有真正可移植的代码所做的,因为无论您发现“几乎所有编译器都执行X”,如果您的代码足够流行,总会有人想要使用“Bob的编译器”编译代码项目“没有这个功能。当然,另一件事是让那些使用“Bob的编译器”的人编辑typedef本身,而不是接受“For Bob的编译器,你需要这个...”补丁,它不可避免地会被你发送。
正如Carl Norum在评论中指出的那样,#ifdef
在很多情况下可能会转换为#if
,然后使用int
和{{1}这样的泛型类型}}。
答案 2 :(得分:0)
使用uint_least32_t
和uint_least64_t
。固定大小的类型uint32_t
和uint64_t
将不存在于没有他们描述的确切大小的系统上。