c - 在 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;
}
}
(对于几分钟前看过这篇文章的人,我不小心删除了它而不是编辑,对不起)
解决方案
逐字节分配,一次一个字节。
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
}
}
推荐阅读
- html - 链接中的锚点在 chrome 中的移动设备上不起作用
- .net - 从 Vb.Net 中活动运行的 Powershell 实例获取信息
- java - 如何使用 Avro 在 Spring Kafka 1.3 中移过不可反序列化的消息
- visual-studio - 打开 .inl 文件会全局中断 IntelliSense
- ios - 如何将外部音频导入语音备忘录应用程序?
- java - Liquibase not creating diff changelog based on JPA Entities
- syslog - Syslog-ng - 将文件名从客户端发送到服务器
- arrays - How do I preselect a vue-multiselect option when options is an array of objects?
- coldfusion - ColdFusion 函数返回错误“系统已尝试使用未定义的值”?
- r - 是否可以堆叠堆积条形图?