【问题标题】:Standard guarantees for aliases of integer types in C/C++? E.g.: Is "unsigned" always equal to "unsigned int"?C/C++ 中整数类型别名的标准保证?例如:“unsigned”总是等于“unsigned int”吗?
【发布时间】:2012-10-05 18:06:15
【问题描述】:

第一个问题:

  • “无符号”总是与“无符号整数”相同吗?
  • “signed”是否总是与“int”相同?
  • “short”总是与“signed short”相同吗?
  • 是……

第二个问题:

如果 C/C++ 标准规定了上述问题的答案,哪些段落与这些问题相关?

【问题讨论】:

    标签: c++ c types integer alias


    【解决方案1】:

    是的,这些都是有保证的。在 C++11 中,请参阅 §7.1.6.2[dcl.type.simple]/table 10,其中列出了所有简单类型说明符(及其组合)及其含义。例如,该表包括以下内容:

    unsigned      => unsigned int
    unsigned int  => unsigned int
    
    signed        => int
    signed int    => int
    int           => int
    

    C11 在第 6.7.2/2 节中具有类似的映射(它的格式不同,但除此之外它指定了相同的等效组合组,至少对于 C 和 C++ 共有的所有类型)。

    【讨论】:

    • 值得注意的是,charsigned charunsigned char 在 C++ 中是 3 种不同的类型。在 C 中,它是实现定义的 char 是有符号还是无符号。
    • @rodrigo,您是否暗示在 C 中,它们不是三种不同的类型? (此外,在 C++ 中,char 是有符号还是无符号也是由实现定义的。)
    • 在 C 和 C++ 中,charsigned charunsigned char 是三种不同的类型。在 C 和 C++ 中,char 是有符号还是无符号由实现定义。
    • @avakar - 实际上,在 C 中它们不同的,但类型标识并不那么相关。如果char 恰好被签名,那么charsigned char 实际上是相同的。在 C++ 中,类型标识 相关的,因为它与许多语言结构相关,例如函数重载或模板实例化:f(char)f(signed char)f(unsigned char) 是 3 个有效的不同重载)。
    • @rodrigo,对,但你不能在 C 中(至少在 C99 中)将 char * 分配给 signed char *,可以吗?
    猜你喜欢
    • 2011-12-12
    • 2017-09-10
    • 1970-01-01
    • 2023-03-15
    • 2013-01-17
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2012-05-06
    相关资源
    最近更新 更多