gpt4 book ai didi

c - 如何将具有两个无符号短裤的结构视为无符号整数? (在 C 中)

转载 作者:行者123 更新时间:2023-12-02 05:34:56 25 4
gpt4 key购买 nike

我创建了一个结构体来表示定点正数。我希望小数点两边的数字都是2个字节。

typedef struct Fixed_t {
unsigned short floor; //left side of the decimal point
unsigned short fraction; //right side of the decimal point
} Fixed;

现在我想添加两个定点数,Fixed xFixed y。为此,我将它们视为整数并相加。

(Fixed) ( (int)x + (int)y );

但正如我的 visual studio 2010 编译器所说,我无法在 Fixedint 之间进行转换。

执行此操作的正确方法是什么?

编辑:我不致力于 Fixed 的 {short floor, short fraction} 实现。

最佳答案

你可以尝试一个讨厌的黑客攻击,但这里有一个字节序问题。无论您做什么转换,编译器应该如何知道您希望 floor 是结果中最重要的部分,而 fraction 是次要的部分?任何依赖于重新解释内存的解决方案都将适用于一种字节序,但不适用于另一种字节序。

你应该:

(1) 显式定义转换。假设 short 是 16 位:

unsigned int val = (x.floor << 16) + x.fraction;

(2) 更改Fixed 使其具有一个int 成员而不是两个short,然后在需要时分解,而不是< em>在需要时作曲。

如果您希望加法速度快,那么 (2) 就是您要做的事情。如果您有 64 位类型,那么您也可以在不分解的情况下进行乘法运算:unsigned int result = (((uint64_t)x) * y) >> 16

顺便说一下,最讨厌的 hack 是这样的:

unsigned int val;
assert(sizeof(Fixed) == sizeof(unsigned int)) // could be a static test
assert(2 * sizeof(unsigned short) == sizeof(unsigned int)) // could be a static test
memcpy(&val, &x, sizeof(unsigned int));

这适用于大端系统,其中 Fixed 没有填充(并且整数类型没有填充位)。在小端系统上,您需要 Fixed 的成员按其他顺序排列,这就是它令人讨厌的原因。有时通过 memcpy 进行转换是正确的做法(在这种情况下,这是一个“技巧”而不是“讨厌的黑客”)。这只是那些时代之一。

关于c - 如何将具有两个无符号短裤的结构视为无符号整数? (在 C 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4023212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com