最佳性能模2 ^ 32实现

时间:2018-10-07 21:04:27

标签: c performance modulo addition

我正在研究SHA-256的实现,并且到了需要对无符号数字进行加模2^32的地步。

我的第一个想法是使用溢出行为:

uint32_t a = ...;
uint32_t b = ...;
uint32_t c = a + b;

但是我有两个问题:

  • 溢出是始终定义的行为,如果我可以依靠的话,它将作为 如果操作数和结果均为模加法sizeof(_operand_) 变量是同一类型?
  • 如何摆脱编译器警告 关于可能的溢出,正确的方法?

我的第二个想法是使用更长类型的变量来实现它:

uint32_t a = ...;
uint32_t b = ...;
uint64_t a_64 = a;
uint64_t b_64 = b;
uint64_t c_64 = a_64 + b_64;
uint32_t c = uint32_t(c_64 & 0xFFFFFFFF);

但是此解决方案需要几个其他变量,包括它们的初始化和其他按位与运算。

C编程原理和性能而言,其中哪些实现(如果有)是正确的?如果没有一个,正确的实现方法是什么?

1 个答案:

答案 0 :(得分:1)

uint32_t是模2 ^ 32类型。它不仅是一种范围至少为2 ^ 32-1的类型,而且根据硬件要求可能还会更多。就是uint32least_t

因此,uint32_t上的加法始终是模加法,不适用于需要溢出概念的操作。最好的解决方案就是a+b