繁体   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