[英]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.