[英]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
。 现在我想知道U64
, uint64_t
和long
的区别在哪里。
如果有人可以向我简单解释一下,包括每个人的优势,我感到非常高兴。
问候,芬兰人
TL; DR - 对于64位精确宽度的无符号整数, #include <stdint.h>
并使用uint64_t
。
据推测, U64
是64位宽无符号整数的自定义typedef。
如果你使用的是至少一个符合C99标准的编译器,它的<stdint.h>
带有一个64位宽无符号整数的typedef
,没有填充位 : 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位宽。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.