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
。现在我想知道U64
、uint64_t
和long
的区别在哪里。
如果有人能简单地向我解释一下这个,包括他们每个人的优点,我很高兴。
您好,
芬恩
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。如果您需要精确的宽度类型,则不会使用 int
或 long
。只有 long long
和 unsigned long long
保证至少为 64 位宽。
在 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 位宽无符号整数的自定义类型定义。
如果您至少使用符合 C99 的编译器,它将具有 <stdint.h>
和 typedef
用于 64 位宽无符号整数 :uint64_t
。但是,代码可能针对未定义标准 uint64_t
的编译器。在那种情况下,可能会有一些配置头,其中为 U64
选择了一个类型。也许你可以 grep
typedef.*U64;
另一方面,
long
是 签名类型 。由于有符号数学的各种未定义和实现定义的方面,您不希望将有符号类型用于位旋转 at 全部。另一个复杂之处在于,与 Java 不同,C long
没有标准化的宽度;相反,long
只允许 32 位宽——在大多数 32 位平台上都是如此,甚至在 64 位平台上也是如此 Windows。如果您需要精确的宽度类型,则不会使用 int
或 long
。只有 long long
和 unsigned long long
保证至少为 64 位宽。