我读到C保留了移位的进位,它可以在特定于处理器的.h中找到。
这是真的,我应该使用它吗?或者应该自己计算出结转位?
答案 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解决方案。
通常,要创建有效的可移植代码,可能需要在更高级别查看问题而不使用执行。另一方面,如果这是针对一系列狭窄的机器,请选择适用于您的机器(或那些支付工资的机器)。
我之前发布的例子中指出了各种各样的弱点。我现在看到这些依赖于实现。有删除。