我需要表示一个40位的二进制数。应该使用哪种C数据类型来处理这个?
答案 0 :(得分:9)
如果您使用的是符合C99或C11标准的编译器,请使用int_least64_t
以获得最大兼容性。或者,如果您想要无符号类型uint_least64_t
。这些都在<stdint.h>
<stdint.h>
通常也定义int64_t
,但由于标准不要求它,因此可能不会在每个实现中定义它。但是:
int_least64_t
- 至少64位,int_fast64_t
- 此实现中最快的大小至少为64位都需要出现在C99和C11中(参见C99标准中的第7.18.1.2-3节和C11标准中的第7.20.1.2-3节)。
虽然C99指定long long
为at least 64 bits on a particular machine(第5.2.4.2.1节),但<stdint.h>
中的类型设计为明确可移植。
您可以在不同平台here上阅读有关整数大小的更多信息。
请注意,整数类型的大小是long
数据类型的问题 - 在64位Windows上,它当前是32位,而在64位linux上它是64位。因此,我相信您使用<stdint.h>
值得注意的是,有些人认为long long
更具可读性。就个人而言,我更喜欢<stdint.h>
中的类型,因为它们允许您在使用它们时说出您的意思 - 我发现它更具可读性。当然,可读性通常是一种品味问题 - 如果你正在使用现有的代码库,我只会遵循他们所做的一切:)
如果您的编译器仅支持C89,那么R..'s solution将允许最多53位的整数精度。
答案 1 :(得分:3)
long long
是一个整数类型,至少 64位。它将在所有平台上符合带符号的40位值。您还可以将unsigned long long
用于64位或更多的无符号值。
答案 2 :(得分:3)
您可以使用long long
,其中包含64位或更多位。有关更多信息,请参阅
http://en.cppreference.com/w/cpp/language/types
http://en.wikipedia.org/wiki/Integer_(computer_science)#Common_long_integer_sizes
答案 3 :(得分:1)
现有答案很好,但如果您也想要C89支持,double
将能够在所有符合IEEE 754标准的实现上精确存储40位整数。