c - 如何在 32 位架构中将 64 位 unsigned long long 分配给 32 位结构

标签 c linux unix embedded 64-bit

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

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

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

myint64_t app_sc;

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

unsigned long long sc;

/* Calculate sc */
...

现在在 64 位机器上,我需要将“sc”分配给 app_sc,并将它用于 64 位机器上的一些计算。

我正在尝试做这样的事情:-

app_sc = sc;

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

 app_sc.low = sc & 0xFFFFFFFF;
 app_sc.high = (sc>>32) & (0xFFFFFFFF);

但这是否保证它在所有情况下都有效?

有没有更好的方法?

最佳答案

使用不太旧的编译器支持相当新的 C 标准(可能是 C99,甚至更早)你应该有一个 <stdint.h> header 为您提供类似 int64_t 的类型(对于带符号的 64 位整数)或 uint64_t (对于无符号的 64 位整数)正好是 64 位,即使在 32 位机器上也是如此。

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

请注意,在 32 位机器上的 64 位算法实际上需要一些编译器支持才能相当有效。 (例如,使用 add with carry 指令)。它不能只通过一个库来完成,即使需要一个库来提供最复杂的操作(例如 32 位机器上的 64 位除法)。换句话说,对于 32 位机器,快速的 64 位算法不能用 C 语言进行可移植编码。

对于更大的数字,考虑使用任意精度数字(称为 bigints ), 例如通过 GNU gmp图书馆。此类库使用非平凡的算法(因此即使是数学也相当困难,您可以阅读整本有关它们的书籍并通过发明具有竞争力的 bigint 实现来获得博士学位)。

关于c - 如何在 32 位架构中将 64 位 unsigned long long 分配给 32 位结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11527055/

相关文章:

c - 如何修剪该数组中的空格(右侧)?

C - 如何迭代文本文件并检查特定字符是否存在

Linux "Perf"工具无法在 docker 镜像中运行?

linux - 如何在 Linux 中就地解压文件

iphone - Unix下针对iphone开发

C - 在 Windows 上编写在 UNIX 上编译,反之亦然

c - 我如何在 Linux 上追踪这种抖动的来源?

c - gcc 的示例 makefile

linux - 使用 Linux (Debian) 获取图像中像素的颜色

c - 无法显示或recv()客户端缓冲区中的数据