我正在研究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
编程原理和性能而言,其中哪些实现(如果有)是正确的?如果没有一个,正确的实现方法是什么?
答案 0 :(得分:1)
uint32_t
是模2 ^ 32类型。它不仅是一种范围至少为2 ^ 32-1的类型,而且根据硬件要求可能还会更多。就是uint32least_t
。
因此,uint32_t
上的加法始终是模加法,不适用于需要溢出概念的操作。最好的解决方案就是a+b
。