如果一个整数默认是有符号的,那么为什么会存在signed关键字呢?

Com*_*r D 7 c c++ unsigned signed

我很好奇为什么存在 signed 关键字,因为我相信大多数整数和其他变量在默认情况下都是有符号的。将 signed 关键字放在 int 之前几乎没有任何作用。它有什么用途,为什么存在?

R..*_*R.. 15

至少有两个地方signed关键字不是空操作:

  • With char:“plain”的签名char是实现定义的。在它是无符号类型的实现上,signed char需要获取有符号的变体。即使char是有符号类型,signed charchar,和unsigned char是完全不同的类型。

  • 使用位域:没有显式签名的位域成员具有实现定义的签名。例如,在

    struct foo {
        int b:1;
    };
    
    Run Code Online (Sandbox Code Playgroud)

    的值范围b可能是 { -1, 0 } 或 { 0, 1 } 取决于实现。如果您想确保获得签名版本,则需要signed关键字。请注意,虽然标准对此不是很清楚,但在流行的实现上,这也适用于typedef:如果位域成员使用typedef不包含显式签名的定义类型,则实现定义的签名(在 GCC 上,由 设置-fsigned-bitfields)也适用于那里。这意味着int32_t应使用signed关键字定义类似类型,以避免在位域中使用时出现非常糟糕的意外行为。