C是否通过<<或>>位移来保持进位?

cxz*_*xzp 2 c bit-shift carryflag

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

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

Oli*_*rth 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);
Run Code Online (Sandbox Code Playgroud)

或者通过执行相反的转变:

uint16_t result = foo << shift;
uint16_t carry  = foo >> (16 - shift);
Run Code Online (Sandbox Code Playgroud)

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