3

我读到 C 保存了班次的进位,它可以在特定于处理器的 .h 中找到。

这是真的吗?我应该使用它吗?还是应该自己解决执行位?

4

2 回答 2

7

在 C 中没有标准的方法来访问原始操作的进位位。

您将需要在更大的数据类型中执行转换:

uint16_t foo = ...;

uint32_t tmp = (uint32_t)foo << shift;
uint16_t result = (uint16_t)tmp;
uint16_t carry  = (uint16_t)(tmp >> 16);

或通过执行相反的转变:

uint16_t result = foo << shift;
uint16_t carry  = foo >> (16 - shift);

请注意,第二种方法调用未定义的行为 if shift == 0,因此您需要单独处理这种情况。

于 2013-05-31T14:57:09.337 回答
1

标准 C 不提供轮班结转的访问权限。
一些(不是全部)C 实现具有特定于处理器的.h 文件或其他允许访问的扩展名。

您应该避免使用特定于处理器的.h 文件中的功能或可行的扩展。但如果必须使用,请考虑编写一个 C 标准解决方案,至少作为文档的一部分请参阅推荐的@Oli Charlesworth 解决方案。

通常,要创建有效的可移植代码,可能需要在更高的层次上查看问题,而不是使用执行。另一方面,如果这适用于范围较窄的机器,请选择适合您的机器(或支付您工资的机器)。

在我之前发布的示例中指出了各种弱点。我现在将这些视为依赖于实现。有删除。

于 2013-05-31T15:41:27.543 回答