3

作为头文件中结构(我们称之为 ASM)的一部分,声明了四个 uint32_t int。

uint32_t Result1; 
uint32_t Result2; 
uint32_t Result3; 
uint32_t Result4; 

我想像这样访问这些:ASM->Result1, ASM->Result2etc 并将它们组合成一个 128 位 int ,其中 Result1 是左侧的 0-31 位,所以最后我将拥有:

返回 128bitint = Result1Result2Result3Result4;

如何才能做到这一点?

4

2 回答 2

4

我会使用联合:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void) {
    union {
        struct {
            uint32_t v1;
            uint32_t v2;
            uint32_t v3;
            uint32_t v4;
        } __attribute__((packed));
        unsigned __int128 i128;
    } t128;
    t128.v1 = 0x22221111;
    t128.v2 = 0x44443333;
    t128.v3 = 0x66665555;
    t128.v4 = 0x88887777;

    printf("0x%016"PRIx64"%016"PRIx64"\n", (uint64_t)(t128.i128 >> 64), (uint64_t)t128.i128);

    return 0;
}

这给出了:

0x88887777666655554444333322221111

作为英特尔(小端)架构的结果。

于 2016-02-20T18:09:44.907 回答
1

为此,您需要支持 128 位整数。

gcc适当的平台上,您可以这样写:

__uint128_t getval(const struct ASM *s) {
    return ((__uint128_t)s->Result1 <<  0) |
           ((__uint128_t)s->Result2 << 32) |
           ((__uint128_t)s->Result3 << 64) |
           ((__uint128_t)s->Result4 << 96);
}

请注意,不清楚您所说的Result1 是左侧的 0-31 位是什么意思。为了阐明您的规范,您必须确定它Result1是低位 32 位(英特尔架构,小端,我上面的代码),还是高位 32 位(大端架构)。

于 2016-02-20T18:06:34.993 回答