gpt4 book ai didi

我可以在临时结果中溢出 uint32_t 吗?

转载 作者:太空狗 更新时间:2023-10-29 17:18:59 26 4
gpt4 key购买 nike

当我这样做时,基本上在 32 位系统上会发生什么:

uint32_t test (void)
{
uint32_t myInt;

myInt = ((0xFFFFFFFF * 0xFFFFFFFF) % 256u );

return myInt;
}

最佳答案

假设 int 是 32 位。

  1. 0xFFFFFFFF 的类型为 unsigned int。有一些特殊的规则可以解释这一点,但是因为它是一个十六进制常量并且它不适合 int,但适合 unsigned int,所以它最终为 unsigned int.

  2. 0xFFFFFFFF * 0xFFFFFFFF 将首先进行通常的算术转换,但由于双方都是 unsigned int,因此什么也不会发生。乘法的结果是 0xfffffffe00000001,通过使用模 232 值将其简化为 unsigned int,得到类型为 1 的值code>unsigned int.

  3. (unsigned int)1 % 256u 等于 1 并且类型为 unsigned int。通常的算术转换也适用于此,但同样,两个操作数都是 unsigned int,因此什么也不会发生。

  4. 结果转换为uint32_t,但它已经是具有相同范围的unsigned int

但是,让我们假设 int 是 64 位。

  1. 0xFFFFFFFF 的类型为 int

  2. 0xFFFFFFFF * 0xFFFFFFFF 会溢出!这是未定义的行为。在这一点上,我们不再试图弄清楚程序的作用,因为它可以做任何事情。也许编译器会决定不为这个函数发出代码,或者一些同样荒谬的事情。

这会发生在所谓的“ILP64”或“SILP64”架构中。这些架构很少见,但它们确实存在。我们可以通过使用 0xFFFFFFFFu 来避免这些可移植性问题。

关于我可以在临时结果中溢出 uint32_t 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48590145/

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