【问题标题】:Is 'long unsigned' as valid as 'unsigned long' in C?'long unsigned' 与 C 中的 'unsigned long' 一样有效吗?
【发布时间】:2013-06-21 16:43:09
【问题描述】:

最近有人问question ULLLLU 在 C 中指定 unsigned long long 常量是否有效。我知道它们都是有效的,但我认为 ULL 会更好,因为它匹配类型unsigned long long

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

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

所以我的问题是:int unsignedlong long unsigned 等其他变体是否符合标准的有效类型?

【问题讨论】:

    标签: c types


    【解决方案1】:

    6.2.5 Types 中的 ISO C11 标准规定:

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

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

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

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

    类型说明符为voidcharshortintlongfloatdoublesignedunsigned、@98765434@3、@98765433@3 <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
    

    【讨论】:

    • 对于一个更模糊的例子,请注意typedef int i;int typedef i; 是等价的。
    • @Mankarse,好点,6.7 允许您重新排序存储类说明符,如 typedef 和类型说明符,如 int。如果我在野外看到int typedef something,我必须再看两次。我几乎肯定会追查并摧毁任何使用i 作为类型名称的人:-)
    【解决方案2】:

    说明符的顺序无关紧要。

    unsigned long long  is the same as long long unsigned.  
    

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

    【讨论】:

    • 这是从某个特定地方引用的还是您只是将它放在引用框中?
    • 不是报价框,是代码框。但是归因会很好。
    • @hacks 我在该页面上看不到任何相关内容。谢谢你浪费了我更多的时间。 -1
    • @Potatoswatter;我最近在我正在关注的书中读到了这一点。我不认为花时间学习某件事是在浪费时间。
    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 2015-08-22
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2012-01-27
    • 2022-12-20
    相关资源
    最近更新 更多