【问题标题】:Is `int` always signed?`int` 总是有符号的吗?
【发布时间】:2017-06-19 07:44:13
【问题描述】:

我一直认为在C语言中,int代表signed int;但我听说这种行为是特定于平台的,在某些平台上,int 默认为unsigned。这是真的吗?标准是什么,它是否随着时间的推移而演变?

【问题讨论】:

  • char 是有符号或无符号的,并且类型不同于 signed charunsigned char。也许这就是你听到的。但intsigned int 是同一类型。
  • "但我听说这种行为是特定于平台的,在某些平台上,int 默认为 unsigned" - char 也是如此。默认情况下,char 可能是 signedunsigned
  • @CoolGuy 哦,这很有趣。也许我可以更新我的问题以将其扩大到char?我不知道这是否是 SO 的“好习惯”。
  • 所有答案都与int 相关,因此将您的问题更改为包含char 会使答案看起来不完整。我不会更新这个问题。只是我的观点。我可能是错的。
  • 不,已经有一个问题:Is char signed or unsigned by default?

标签: c int language-lawyer signed


【解决方案1】:

你说的很对。根据C11(最新的 标准),第§6.7.2 章

  • intsignedsigned int

被归类为相同的类型(确切地说是类型说明符)。所以,intsigned int 是一样的。

此外,从第 §6.2.5/P4 章重复相同的内容

有五种标准有符号整数类型,分别指定为signed charshort intintlong intlong long int。 (这些和其他类型可能是 以几种其他方式指定,如 6.7.2 中所述。)[....]

因此,对于任何符合要求的环境,int 代表 signed int,反之亦然。

【讨论】:

  • 自 2011 年以来是新事物吗? K&R C 和 C89 呢?
  • @Boiethios 我不确定C89/90,但C99 完全一样,而且我认为早些日子也没有任何理由。
  • 在 C89 中,在 §3.5.2 Type specifiers 下它声明 int , signed , signed int , or no type specifiers (...) the above comma-separated lists designates the same type, except that for bit-field declarations, signed int (or signed ) may differ from int (or no type specifiers).
  • @Tardis 真棒......就是这样。感谢您的信息,让我将其添加到我的答案中。
  • 当然,添加它:-) 它应该回答@Boiethios 的附加问题。值得注意的是,正如 §3.5.2 中引用的语言所暗示的那样,根据 C89,int 的另一个同义词是“无类型说明符”,因为在这种情况下,int 是隐含的,并且这种隐式类型从 C99 开始从 C 标准中删除。 SO上有一个post关于这个。
【解决方案2】:

intsignedsigned int 都是同一类型。

int 的确切形式 是特定于实现的;范围必须至少为 -32767 到 +32767。范围没有上限。另请注意,补码方案也可能有所不同:尽管 1 的补码和有符号幅度也是允许的,但如今 2 的补码很常见。

【讨论】:

    【解决方案3】:

    根据this 维基百科文章,int 是一个有符号整数数据类型,其大小至少为 16 位。

    【讨论】:

    • 100% 正确,但是像标准一样使用主要权威总是好的。 (只是一个笨蛋,但在形式上很重要:)
    • @DavidC.Rankin 感谢您的评论,您是完全正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    相关资源
    最近更新 更多