我正在研究SHA-256的实现,我已经到了需要无符号数的加法模2^32
的地步。
我的第一个想法是使用溢出行为:
uint32_t a = ...;
uint32_t b = ...;
uint32_t c = a + b;
但我有两个担心:
溢出总是被定义的行为,如果我可以相信它会像
如果操作数和结果都是模加法
变量类型相同?
如何消除编译器警告
关于可能的溢出,正确的方法?
我的第二个想法是使用较长类型的变量来实现它:
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);
但是这个解决方案需要几个额外的变量,它们的初始化和额外的位操作。
这些实现中的哪一个(如果有的话)在编程原则和性能方面是正确的?如果没有,正确的实现方法是什么?
最佳答案
uint32_t
是模-2^32类型。它不仅是一种范围至少达到2^32-1的类型,而且根据硬件需求可能会有更多的类型;这将是uint32least_t
。
因此,uint32_t
上的加法总是模加法,它不适合需要溢出概念的运算。最好的解决办法就是a+b
。
关于c - 最佳性能加法2 ^ 32实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52692899/