缩写类型名称 long long 与 long long int,它是否符合标准?

5
我看到的大部分代码在声明变量时使用了缩写类型,例如:

long long x; // long long int x
short y; // short int y

我翻译的结果如下:

我浏览了C++11标准(3.9.1节),发现类型总是完全声明为long long int。我找不到任何关于缩写类型的提及。我相信这些缩写符合标准,但想确认一下是否确实如此。因此,我的问题是上述代码是否完全符合标准。


当我需要一个精确的类型时,我更喜欢使用像stdint.h中定义的int16_t或int32_t这样的类型。 - Antonio
1
@Antonio 但是什么时候需要精确类型呢? - James Kanze
1
@JamesKanze 图像处理,例如。 - Antonio
1
@JamesKanze 一切都始于(假设是灰度)像素,通常具有精确类型(8位无符号)。然后,例如,您可以使用掩模进行卷积,您知道结果将具有某个大小(例如16位有符号)。您必须将结果存储在内存中,最好选择精确类型。此外,在开始使用SSE / NEON指令集时非常方便。 - Antonio
@Antonio,我认为你的论点更适用于使用共享内存与协处理器或显示设备时的固定大小类型。我可以接受这一点;你的代码和协处理器必须看到相同的大小。(虽然固定大小类型可能并不必要,因为代码无论如何都不会可移植。)但是我所见过的实际图像处理(尝试在图像中找到特定的模式)并不需要固定宽度大小。 - James Kanze
显示剩余3条评论
3个回答

6
是的,这是有效的。它在C++11标准草案7.1.6.2简单类型说明符中有所涵盖,其中写道:

表格10总结了简单类型说明符的有效组合和它们指定的类型。

而在表格10 简单类型说明符及其指定的类型中则表示:

long long      “long long int”

并且:

short          “short int”

2

是的,但自C++99以来,使用大小类型会更好。

std::int8_t
std::int16_t
std::int32_t
std::int64_t

尽可能使用已定义的类型,例如intfloat和它们的无符号版本std::uint8_t等等,这样你就知道你正在处理什么。

请注意,编译器不必支持64位整数类型。


5
它们也不必支持32位、16位或8位的整数类型,事实上,它们不必支持任何intN_t类型定义。除非你在一个非常奇怪的体系结构上(例如9位字节或没有子集的48位整数),否则这几乎只是一个学术问题,但并不仅限于古老的主机:一些现代DSP采用了这种方式。 - Sebastian Redl
5
只有在需要时才使用固定大小类型,如果可以的话,请至少使用最小大小类型:int_least8_t int_least16_t ...。 - Deduplicator
不幸的是,大小类型也有自己的陷阱。 给定 uint32_t x = 0xFF000000;,如果int为32位,则语句x = x * x;将按预期工作,但如果int为64位,则撤销时间,空间和因果律。 更糟糕的是,有些人似乎认为编译器在后一种情况下应该撤消时间,空间和因果律。 - supercat

1

是的,请查看7.1.6.2中的表格10,其中定义了从各种限定符组合到3.9类型的映射。


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