首页 > 解决方案 > 在 C 中定义一个 128 位整数

问题描述

为了表示这个值,我遵循以下定义:

#define NUM_BITS 128
typedef unsigned char BigInt[NUM_BITS/8];

也就是说,BigInt 类型的值必须由字节数组表示,解释为单个 128 位整数,采用二进制补码并遵循 little-endian 顺序。

例如 ,{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}表示整数值 1。

我一直在考虑做这样的功能:

void big_val (BigInt res, long val);

这将是一个带有扩展名的归因。big_val 函数将 l (有符号长整数)提供的值分配给 res,正确扩展为 128 位。

例如,我正在考虑获取最高有效字节,获取数字的符号,y = val & 0xFF000000;然后再重复此字节 8 次以形成我的数组。但是我怎么能得到代表没有信号的数字的字节呢?

这就是我到目前为止所做的:

void big_val(BigInt res, long val){
    long y;
    y = val&0xFF000000;

    for(int i = 8; i < 16; i++){
        res[i] = y;
    }
}

(对于几分钟前看过这篇文章的人,我不小心删除了它而不是编辑,对不起)

标签: ctype-conversionbit-manipulation64-bitbit

解决方案


逐字节分配,一次一个字节。

void BigInt_init_from_long(BigInt res, long val){
    size_t i;
    bool negative = val < 0;
    for (i = 0; i < sizeof(long); ++i) {
        res[i] = val & 0xff;
        val >>= 8;
    }
    for (; i < NUM_BITS/8; ++i) {
        res[i] = negative ? 0xff : 0; // sign extension
    }
 }

推荐阅读