Программирование в шахматной доске на C

#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. Вы не правы, переполнение для подписанных типов приводит к неопределенному поведению, усечение или обтекание не гарантируется