C: разница между U64 и uint64_t - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь выучить C после работы с Java в течение нескольких лет.Я нашел код, который хотел воспроизвести, который выглядел примерно так:

U64 attack_table[...]; // ~840 KiB 

struct SMagic {
   U64* ptr;  // pointer to attack_table for each particular square
   U64 mask;  // to mask relevant squares of both lines (no outer squares)
   U64 magic; // magic 64-bit factor
   int shift; // shift right
};

SMagic mBishopTbl[64];
SMagic mRookTbl[64];

U64 bishopAttacks(U64 occ, enumSquare sq) {
   U64* aptr = mBishopTbl[sq].ptr;
   occ      &= mBishopTbl[sq].mask;
   occ      *= mBishopTbl[sq].magic;
   occ     >>= mBishopTbl[sq].shift;
   return aptr[occ]; 
}

U64 rookAttacks(U64 occ, enumSquare sq) {
   U64* aptr = mRookTbl[sq].ptr;
   occ      &= mRookTbl[sq].mask;
   occ      *= mRookTbl[sq].magic;
   occ     >>= mRookTbl[sq].shift;
   return aptr[occ];
}

Код не так важен, но я уже не смог использовать тот же тип данных: U64, я только нашел uint64_t.Теперь я хотел бы знать, где разница в U64, uint64_t и long.

Я очень рад, если кто-то может кратко объяснить это мне, в том числе преимущество каждого из них.

Привет, Финн

1 Ответ

0 голосов
/ 27 мая 2018

TL; DR - для 64-битного целого числа без знака точной ширины, #include <stdint.h> и использования uint64_t.


Предположительно, U64 - это пользовательский typedef для 64-битной ширины без знака.целое число.

Если вы используете хотя бы C99-совместимый компилятор, он будет иметь <stdint.h> с typedef для 64-разрядного целого числа без знака без битов заполнения : uint64_t,Однако может случиться так, что код нацелен на компилятор, у которого не определен стандарт uint64_t.В этом случае может быть некоторый заголовок конфигурации, в котором тип выбран для U64.Возможно, вы можете grep файлы для typedef.*U64;


long, с другой стороны, это подписанный тип .Из-за различных неопределенных и определяемых реализацией аспектов математики со знаком вам не захочется использовать тип со знаком для разбивки битов при всех.Другая сложность заключается в том, что в отличие от Java, C long не имеет стандартизированной ширины;вместо этого long может иметь ширину всего 32 бита - это так на большинстве 32-битных платформ и даже на 64-битных Windows.Если вам когда-нибудь понадобятся точные типы ширины, вы не будете использовать int или long.Только long long и unsigned long long гарантированно имеют ширину не менее 64 бит.

...