C:U64和uint64_t的区别

C: Difference between U64 and uint64_t

在 Java 工作了几年后,我正在尝试学习 C。 我发现了一些我想重现的代码,看起来像这样:

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。现在我想知道U64uint64_tlong的区别在哪里。

如果有人能简单地向我解释一下这个,包括他们每个人的优点,我很高兴。

您好, 芬恩

TL;DR - 对于 64 位精确宽度无符号整数,#include <stdint.h> 并使用 uint64_t.


据推测,U64 是 64 位宽无符号整数的自定义类型定义。

如果您至少使用符合 C99 的编译器,它将具有 <stdint.h>typedef 用于 64 位宽无符号整数 uint64_t。但是,代码可能针对未定义标准 uint64_t 的编译器。在那种情况下,可能会有一些配置头,其中为 U64 选择了一个类型。也许你可以 grep typedef.*U64;

的文件
另一方面,

long 签名类型 。由于有符号数学的各种未定义和实现定义的方面,您不希望将有符号类型用于位旋转 at 全部。另一个复杂之处在于,与 Java 不同,C long 没有标准化的宽度;相反,long 只允许 32 位宽——在大多数 32 位平台上都是如此,甚至在 64 位平台上也是如此 Windows。如果您需要精确的宽度类型,则不会使用 intlong。只有 long longunsigned long long 保证至少为 64 位宽。