【问题标题】:In what circumstance will a value be promoted to an unsigned int?在什么情况下会将值提升为无符号整数?
【发布时间】:2019-12-21 17:02:16
【问题描述】:

按照标准C11 p6.3.1.1

如果一个 int 可以表示原始类型的所有值(受限制 通过宽度,对于一个位域),该值被转换为一个 int; 否则,它将转换为无符号整数。这些被称为 整数促销.58) 所有其他类型都不会被整数改变 促销活动。

我很好奇在什么情况下一个值会被提升为unsigned intshort int 这样的类型绝对适合带符号的 int,即使我在结构中定义了 31 位作为位字段,它仍然适合带符号的 int。

【问题讨论】:

  • 没有将整数默认转换为 unsigned int,如果您将类型定义为 int,它将保持为 int。
  • @pmg 我不认为你的例子有提升,你的例子被定义为标准 6.4.4.1 整数常量中的常量类型
  • unsigned short 如果不适合 int
  • @WeatherVane unsigned short 什么时候不适合 intunsigned short intsigned int 短得多,即使后者有一个有符号位。
  • 当它是 32 位时。 unsigned short最少为 16 位。

标签: c


【解决方案1】:

这种情况是提升等级低于int 的整数类型的最大值。所以它发生在unsigned shortunsigned charchar 上,而它在平台上是unsigned

USHRT_MAX 大于INT_MAX 时,unsigned short 被隐式提升为unsigned int 类型。类似地,当UCHAR_MAX 大于INT_MAX 时,则unsigned char 提升为unsigned int 类型。而且,当平台上的charunsigned 并且UCHAR_MAX 大于INT_MAX 时,char 也会发生同样的情况。

_Bool 将始终转换为 int。尽管_Bool 中的位数至少为CHAR_BIT,但_Bool 的宽度为1 位,因此int 将始终能够表示所有_Bool 值。 (我不确定标准的“受宽度限制”部分是否仅适用于位域或所有进行转换的类型。“位域”部分之前有一个逗号。)

附:这篇文章是关于 C++ 的,但我想推荐它:No-one knows the type of char + char。它涉及到确切的问题 - char + char 可以是 intunsigned int,这取决于 char 是否无符号以及 char 是否可以容纳更大的值然后 int

即使我将结构中的 31 位定义为位字段,它仍然适合带符号的 int。

并非总是如此。可以用宽度为 31 位的位域结构成员表示的值范围可能不适合 signed int 变量。简单地说,signed int 在特定架构上可能有 30 位或更少的位。 signed int 必须代表-32767+32767 之间的值至少。所以2^31 可能不适合signed int

【讨论】:

  • 忽略虚构的计算机更有帮助。在现实世界的计算机上,char + char 始终是 int。我相信对于各种具有 16 位字节的异国情调、过时的 DSP 来说也是如此。
猜你喜欢
  • 2020-04-16
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 2014-10-27
  • 2017-07-01
  • 1970-01-01
相关资源
最近更新 更多