gpt4 book ai didi

c++ - 在没有转换的情况下使用十六进制值时的未定义行为

转载 作者:行者123 更新时间:2023-12-03 10:05:35 25 4
gpt4 key购买 nike

这是我遇到过的最奇怪的问题。我正在编写一个国际象棋引擎,我有一个返回排名掩码的函数。例如,考虑这个 64 位位板。

00000000
00000000
00000000
00000000
00000100
00000000
00000000
00000000

中间的1是一 block 。

现在我的函数应该返回

00000000
00000000
00000000
00000000
11111111
00000000
00000000
00000000

很简单,只需要返回一个等级掩码即可。这是我的代码

uint64_t get_rank_mask(int sq)
{
return (0xFF<<(sq-(sq%8)));
}

这是当我传递 36 或正方形 e5

时函数返回的内容
00000000
00000000
00000000
00000000
00000000
00000000
00000000
11111111

嗯,这很奇怪。让我对代码做一点小改动。

uint64_t get_rank_mask(int sq)
{
uint64_t mask = 0xFF;
mask<<=(sq-(sq%8));
return mask;
}

这里是返回值

00000000
00000000
00000000
11111111
00000000
00000000
00000000
00000000

神奇的是,这就是预期的结果。我什至不知道这两个代码示例之间的区别。谁能解释这种行为?

最佳答案

0xFF 是一个 int。假设 int 有 32 位,将这个值左移 32 将调用未定义的行为。

在第二个版本中,您将 0xFF 存储在无符号整数类型中。这可以移动任意数量的位,并且该操作定义明确。在您的情况下,您将它存储在一个 64 位的无符号整数中,因此向左移动 32 位会得到您想要的结果。

关于c++ - 在没有转换的情况下使用十六进制值时的未定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63955544/

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