如何在32位架构中分配64位无符号长long到32位结构

Vik*_*iks 1 c unix linux embedded 64-bit

我有2个内核,一个是32位,另一个是64位.

在64位机器上,我支持unsigned long long,我需要将这个值赋给一个可以在32位机器上访问的varriable,例如: -

typedef struct {
    unsigned int low;
    unsigned int high;
} myint64_t;

myint64_t app_sc;
Run Code Online (Sandbox Code Playgroud)

以下是64位机器的代码片段:

unsigned long long sc;

/* Calculate sc */
...
Run Code Online (Sandbox Code Playgroud)

现在在64位机器上,我需要将"sc"分配给app_sc,并将其用于64位机器上的某些计算.

我试图做这样的事情: -

app_sc = sc;
Run Code Online (Sandbox Code Playgroud)

但编译器给我编译时错误.我可以这样做,像这样: -

 app_sc.low = sc & 0xFFFFFFFF;
 app_sc.high = (sc>>32) & (0xFFFFFFFF);
Run Code Online (Sandbox Code Playgroud)

但这是否有保证,它适用于所有情况?

有没有更好的方法呢?

Bas*_*tch 5

使用一个不太旧的编译器支持一个合理的最新C标准(可能是C99,甚至更早)你应该有一个<stdint.h>标题给你一个类型int64_t(对于一个有符号的64位整数)或uint64_t(对于一个无符号的64位整数),这是完全正确的64位,即使在32位机器上也是如此.

如果您的编译器没有它,我强烈建议升级您的编译器.您可以使用GCC(除非您有一个非常奇怪的目标架构,GCC不支持).最新的GCC版本是4.7.

请注意,32位机器上的64位算术实际上需要一些编译器支持才能合理有效.(例如使用附带携带说明).它不能仅通过库来完成,即使需要库来提供最复杂的操作(例如32位机器上的64位分区).换句话说,对于32位机器,快速64位算术不能在C中进行可移植编码.

对于更大的数字,考虑使用任意精度数字(称为 bigints),例如通过GNU gmp库.这些库使用非平凡的算法(所以即使数学也很困难,你可以通过发明有竞争力的bigint实现来阅读整本书并获得博士学位).