如何用C实现INT40?

问题描述 投票:0回答:1

如何用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 bit-fields
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.