如何用C语言实现INT40?是一个5字节的有符号整型变量,可以进行正常的加减乘除吗?
#include <stdio.h>
struct INT40
{
long long data : 40;
};
int main(void)
{
struct INT40 my_data;
my_data.data = 0x000000FFFFFFFFFF;
long long other_data = 0x000000FFFFFFFFFF;
printf("%lld\n", my_data.data);
printf("%lld", other_data);
return 0;
}
我可以使用位字段来做到这一点吗?可以好好发挥作用吗?
这个问题当然不值得在评论中受到严厉的批评:由于位域中实现定义的行为,位精确的有符号和无符号整数类型在 C 标准中没有得到完全支持,特别是关于符号性和除
int
。
即将推出的 C23 标准确实为您的目的提供了一个解决方案:类型
_BitInt(40)
和 unsigned _BitInt(40)
是位精确的有符号和无符号整数,正好 40 位(包括有符号版本的符号位)。
此外,这种类型的值不会受到通常的整数提升规则的影响:
6.3.1.8 常用算术转换
作为通常算术转换的一部分,二元运算符的a
操作数并不总是提升为_BitInt
或int
。相反,较低等级的操作数会转换为较高等级的操作数类型,并且运算结果是较高等级的类型。unsigned int
所以如果你能找到一个符合这个标准的编译器,你可以这样写:
#include <stdio.h>
typedef _BitInt(40) INT40;
int main(void) {
INT40 my_data = 0x000000FFFFFFFFFF;
long long other_data = 0x000000FFFFFFFFFF;
printf("%w40d\n", my_data);
printf("%lld\n", (long long)my_data);
printf("%lld\n", (long long)(INT40)other_data);
printf("%lld\n", other_data);
return 0;
}
并看到这个输出:
-1
-1
-1
1099511627775
我的 macbook 上的 clang 编译了上述代码,但 C 库不支持
w
长度修饰符,输出为:
w40d
-1
-1
1099511627775