gpt4 book ai didi

c - 最佳性能加法模 2^32 实现

转载 作者:太空宇宙 更新时间:2023-11-04 03:15:12 25 4
gpt4 key购买 nike

我正在研究 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 编程原则和性能而言,这些实现中的哪一个(如果有)是正确的?如果没有,正确的实现是什么?

最佳答案

uint32_t 是模 2^32 类型。它不仅是一种范围至少达到 2^32-1 的类型,而且根据硬件要求可能更多;那将是 uint32least_t

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

关于c - 最佳性能加法模 2^32 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52692899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com