C是否保持<<<<<<<<或者>>位移?

时间:2013-05-31 14:56:14

标签: c bit-shift carryflag

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

这是真的,我应该使用它吗?或者应该自己计算出结转位?

2 个答案:

答案 0 :(得分:6)

没有标准的方法来访问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);

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

答案 1 :(得分:1)

标准C 不允许从班次中取出 某些,而非所有C实现都有特定于处理器的文件或允许访问的其他扩展。

您应该避免在可行的情况下使用特定于处理器的文件或扩展的功能。但如果有义务使用,请考虑编写C标准解决方案,至少作为文档的一部分。参见推荐的@Oli Charlesworth解决方案。

通常,要创建有效的可移植代码,可能需要在更高级别查看问题而不使用执行。另一方面,如果这是针对一系列狭窄的机器,请选择适用于您的机器(或那些支付工资的机器)。

我之前发布的例子中指出了各种各样的弱点。我现在看到这些依赖于实现。有删除。