无符号长长整型占用多少字节?

96

unsigned long long占用多少字节? 它和unsigned long long int是一样的吗?


56
请问需要翻译的内容是什么语言呢?如果是英文,该句话的意思是“求无符号长整型(unsigned long long)的大小”。 - PrettyPrincessKitty FS
2
相关的,有点。https://dev59.com/Cm855IYBdhLWcg3weEGJ - John Dibling
2
C和C++标准应该采用带有数字的内容,以覆盖编译器自动选择的方式。例如float32、float64、int32等,直到我们需要的极限为止,比如int256或float1024?这将真正消除痛苦... - jokoon
2
@gokoon:正如我在答案中所解释的那样,C标准已经有了int32_tuint64_t等类型。C++将在即将到来的标准中引入它们。它们在头文件<stdint.h>中。 - Fred Foo
1
浮点数和双精度数怎么样? - jokoon
4个回答

97

执行摘要:它是64位或更大。

unsigned long long 等同于 unsigned long long int。其大小取决于平台,但由C标准(ISO C99)保证至少为64位。在C89中没有 long long,但显然即使是MSVC也支持它,因此它具有相当的可移植性。

在当前的C++标准(发布于2003年)中,没有 long long,尽管许多编译器将其作为扩展支持。即将到来的C++0x标准将支持它,并且其大小与C中的大小相同,因此至少为64位。

您可以使用表达式 sizeof(unsigned long long) 精确获取字节大小(典型平台上为8位)。如果您想要精确的64位,请使用 uint64_t,它定义在头文件 <stdint.h> 中,以及一堆相关类型(可在C99、C++11和一些当前的C++编译器中使用)。


2
@lars:sizeof(char) 保证返回恰好一个。它返回操作数的字节数,而不是“char单位”的数量。因此,在大多数平台上不是字节,而是在每个平台上都是字节。 - John Dibling
2
@John:这取决于字节的定义。如果你将char和byte等同起来,那么你是正确的。如果你将char八位字节等同起来,那么情况就不同了。 - Fred Foo
4
@lars:不是的,它并不是。在每个平台上,一个char始终恰好占用一个字节。标准没有规定一个字节有多少位,但那是另一回事。实现可以使用64位字节,这将导致sizeof(long long)== 1,这也是符合规范的。 - John Dibling
1
@lars:我已经给你点赞了,但是有一个小问题:“C标准(ISO C99)保证至少64位== 8字节”,我无法想象64位不等于8字节的非嵌入式世界,但标准没有保证。 - John Dibling
@John:你说得没错。我已经处于语言律师的模式下,删除了 64 位 == 8 字节。而且我听说确实存在嵌入式平台,其中一个字节是 16 位。 - Fred Foo
我知道这是一个常见的误解。但是最后一次发布的标准是2003年的。它不仅仅是技术勘误。 - Johannes Schaub - litb

19

C++的优美之处,就像C一样,是这些东西的大小由实现定义,因此在不指定您使用的编译器的情况下没有正确答案。它们两个是一样的吗?是的。对于任何接受两者的编译器,“long long”都是“long long int”的同义词。


3
虽然你所说的在技术上是正确的,但标准要求long long至少为64位长,我不知道任何定义除64位之外大小的实现。当128位编译器出现时,这可能会改变,但对于当前的编译器来说,假设64位并不是一种牵强的想法。 - Boaz Yaniv
3
+1,抵消负评。答案取决于“is”的含义。 - Andy Finkenstadt
3
@Andy:比尔·克林顿?那是你吗? ;) - John Dibling
7
这绝对不是“C++之美”,它完全是一种痛苦 :p - asimes
@MichaelBurr 八年过去了,我仍在质疑自己的人生意义,试图找出如何尽可能接近Rust强制类型大小的方式,至少从编写字面量的程序员的角度,在编译时。但是仍然没有这样的运气。像这样的事情只会带来纯粹的痛苦。 - user11877195

16

必须至少为64位,除此之外实现是定义的。

严格来说,在C++0x标准之前,unsigned long long不是C++标准中的类型。 unsigned long long是类型unsigned long long int的“simple-type-specifier”(它们是同义词)。

long long类型集也在C99中,并且即使在被标准化之前,它也是C ++编译器的常见扩展。


1
最近批准了吗?上次我查看时,他们考虑将其推迟到2012年。 - Fred Foo
1
@In silico:我看过了。我还在某个地方看到可能会有延迟,但老实说我记不清在哪里看到的了。 - Fred Foo
1
@larsmans:除非我看到关于FDIS延迟的官方消息(在搜索引擎中查询“C ++ 0x FDIS delay”未给我带来任何相关结果),否则我完全期望该标准在2011年发布,尽管标准本身存在严重问题。 - In silico
1
@In silico:我也没有找到相关的参考资料,所以我猜这可能是谣言或者是我的误解。不过,我认为FDIS状态并不等同于完全批准,对吧? - Fred Foo
显示剩余2条评论

2

使用运算符sizeof,它会返回以字节为单位表示的类型大小。一个字节等于八个位。请参考以下程序:

#include <iostream>

int main(int,char**)
{
 std::cout << "unsigned long long " << sizeof(unsigned long long) << "\n";
 std::cout << "unsigned long long int " << sizeof(unsigned long long int) << "\n";
 return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接