如何将 4 个 uint32_t int 组合成一个完整的 128 位 int 和 return
How to combine 4 uint32_t ints into a whole 128 bit int and return
作为头文件中结构(我们称之为 ASM)的一部分,声明了四个 uint32_t 整数。
uint32_t Result1;
uint32_t Result2;
uint32_t Result3;
uint32_t Result4;
我想像这样访问这些:ASM->Result1, ASM->Result2
等并将它们组合成一个 128 位 int,Result1 是从左边开始的第 0-31 位,所以最后我有:
return 128bitint = Result1Result2Result3Result4;
如何做到这一点?
为此您需要支持 128 位整数。
with 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 位(大端架构)。
我会使用联合:
#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
作为英特尔(小端)架构的结果。
作为头文件中结构(我们称之为 ASM)的一部分,声明了四个 uint32_t 整数。
uint32_t Result1;
uint32_t Result2;
uint32_t Result3;
uint32_t Result4;
我想像这样访问这些:ASM->Result1, ASM->Result2
等并将它们组合成一个 128 位 int,Result1 是从左边开始的第 0-31 位,所以最后我有:
return 128bitint = Result1Result2Result3Result4;
如何做到这一点?
为此您需要支持 128 位整数。
with 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 位(大端架构)。
我会使用联合:
#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
作为英特尔(小端)架构的结果。