我正在做一个项目,需要将__int128转换为uint8_t的向量。
我已经有了一个函数,可以将long转换为uint8_t向量。
我想做的事情是这样的:
__int128 data = 0x5bc5ddd975d34ed0b4f18b410e7d2480
addLong(data >> 64);
addLong(data & 0xFFFFFFFFFFFFFFFF);
我得到的结果是0000000000b4f18b41e7d2480
正如你所看到的,第二部分,64个较低有效字节被正确处理了,但是大多数字节没有被正确处理。你知道这是否可能吗?
做一些类似的事情:
std::cout << std::hex << (long)(data >> 48) << std::endl;
得到的结果是:b4f1。
这就是为什么我认为位运算符不适用于__int128。
2条答案
按热度按时间p8ekf7hl1#
不幸的是,gcc仍然不支持
__int128
/unsigned __int128
常量(它们没有后缀,比如ll
表示long long)。您的示例应该生成一个警告,指出您的文本值被截断为
long long
值:godbolt
(if如果没有,则很可能已禁用
-Wconversion
-默认情况下已启用)按位运算应该可以正常工作。
如果要使用标准库函数(
std::abs
,等等...)对于128位int,您需要确保您没有在严格的标准模式下编译(即-std=c++20
),而是以标准的GNU方言(例如-std=gnu++20
)(如果您根本不指定-std
,则这是默认值)-否则int 128会为std::abs
等won't be available重载。用户定义的文本
利用C20
consteval
和user-defined literals可以为__int128
构建自定义编译时文字。(it可以通过用
constexpr
替换consteval
来使用这个C20之前的版本,但是在这种情况下,如果字面量有问题,就不会出现编译时错误)虽然对于int解析来说,这是一个很大的样板,但是如果你的程序中有很多
__int128
常量,这可能是值得的:godbolt
这将允许您编写
__int128
/unsigned __int128
常量,如下所示:godbolt
bf1o4zei2#
位运算符起作用,但初始化不起作用。整数字面值不能大于
long long
。我建议为初始化添加一个helper函数(如果gcc中还没有的话):
产出