簡體   English   中英

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位寬無符號整數的自定義typedef。

如果你使用的是至少一個符合C99標准的編譯器,它的<stdint.h>帶有一個64位寬無符號整數typedef ,沒有填充位uint64_t 但是,可能是代碼的目標是沒有定義標准uint64_t的編譯器。 在這種情況下,可能會有一些配置標頭,其中為U64選擇了一個類型。 也許你可以grep文件為typedef.*U64;


long ,另一方面,是一個有符號的類型 由於簽署了數學的各種不確定和實施定義方面,你不希望所有使用位變換簽署的類型。 另一個復雜因素是,與Java不同,C long沒有標准化的寬度; 相反, long只允許32位寬 - 在大多數32位平台上都是如此,甚至在64位Windows上也是如此。 如果您需要精確的寬度類型,則不會使用intlong 只保證long long unsigned long long至少為64位寬。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM