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)
但这是否有保证,它适用于所有情况?
有没有更好的方法呢?
使用一个不太旧的编译器支持一个合理的最新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实现来阅读整本书并获得博士学位).