10

最近有人问了一个问题ULL,即在 C 中指定 unsigned long long 常量是否LLU有效。我知道它们都是有效的,但我认为这ULL会更好,因为它与 type 匹配unsigned long long

不过,我现在不太确定。gcc编译器毫无怨言地允许以下内容:

int main(void) {
    unsigned int a = 1;
    int unsigned b = 2;
    return 0;
}

所以我的问题是:是int unsigned,以及其他变体,如long long unsigned根据标准的有效类型吗?

4

2 回答 2

16

ISO C11 标准规定6.2.5 Types

有五种标准有符号整数类型,指定为signed char、short int、int、long int 和long long int。

对于每个有符号整数类型,都有一个对应的(但不同的)无符号整数类型(用关键字unsigned指定),它使用相同的存储量(包括符号信息)并具有相同的对齐要求。

但是,该部分没有规定基本类型和修饰符出现的顺序。unsigned

控制部分在标准的后面,在6.7.2 Type specifiers这里解释:

类型说明符是void, char, short, int, long, float, double, signed, unsigned, _Bool, _Complex, <struct-or-union-specifier>, <enum-specifier>, 和<typedef-name>.

在每个声明的声明说明符中,以及每个结构声明和类型名称的说明符-限定符列表中,至少应给出一个类型说明符。每个类型说明符列表应为以下多重集之一(当每个项目有多个多重集时,以逗号分隔);类型说明符可以以任何顺序出现,可能与其他声明说明符混合。

然后它继续列出所有的多重集,例如unsigned long, or unsigned long int.

但是重要的短语是the type specifiers may occur in any order,这意味着 所有这些都对该多重集有效:

unsigned long
long unsigned

unsigned long int
unsigned int long
long unsigned int
long int unsigned
int unsigned long
int long unsigned
于 2013-06-25T01:57:06.387 回答
0

说明符的顺序无关紧要。

unsigned long long  is the same as long long unsigned.  

根据 C 标准(c99),这两种类型都有效。

于 2013-06-25T02:07:05.977 回答