#c #bit-manipulation #bit #chess
#c #манипулирование битами #бит #шахматы
Вопрос:
У меня проблема с этим фрагментом кода на C.
#include <stdio.h>
#include <stdint.h>
typedef uint64_t bboard;
// Accessing a square of the bitboard
int
get (bboard b, int square)
{
return (b amp; (1ULL << square));
}
void
print_board (bboard b)
{
int i, j, square;
for (i = 7; i >= 0; i--) // rank => top to bottom
{
for (j = 0; j < 8; j ) // file => left to right
printf ("%d ", get (b, j 8*i) ? 1 : 0);
printf ("n");
}
}
int
main ()
{
bboard b = 0xffffffffffffffff;
print_board (b);
}
// result that I have
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Хорошо, почему на bitboard не установлен бит, равный 1?
По любому вопросу, пожалуйста, добавьте комментарий. Ty 😀
Ответ №1:
get
возвращает int
, но (b amp; (1ULL << square))
является uint64_t
. Когда (b amp; (1ULL << square))
больше INT_MAX
, результат не определен; в этом случае он усекается и возвращается 0
.
Если вместо этого get
возвращает bboard
, это работает так, как ожидалось (проверено здесь: http://codepad.org/zEZiJKeR).
Комментарии:
1. Вы не правы, переполнение для подписанных типов приводит к неопределенному поведению, усечение или обтекание не гарантируется