【问题标题】:integer conversion rank and promotion整数转换排名和提升
【发布时间】:2016-12-15 17:27:27
【问题描述】:

阅读整数提升和整数转换排名我发现了这个link

  • 1.如果两个操作数的类型相同,则不需要进一步转换。

  • 2.否则,如果两个操作数都是有符号整数类型或都具有无符号整数类型,则操作数类型为较小整数 转换等级转换为具有更大的操作数的类型 排名。

  • 3.否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则 带符号整数类型的操作数转换为 无符号整数类型的操作数。

  • 4.否则,如果带符号整数类型的操作数可以表示无符号操作数类型的所有值 整数类型,然后转换无符号整数类型的操作数 为有符号整数类型的操作数的类型。

  • 5.否则,两个操作数都转换为无符号整数类型,对应带符号整数类型的操作数。

第 1 2 3 点非常清楚,但我仍然没有为案例 4 和 5 提供示例。有人可以提供有关任何实现的示例吗?

据我所知整数转换等级是:

_Bool

无论与类型相关的字节大小相等或更高。对吧?

关于从一种类型到另一种类型的提升或转换。添加到最低类型 0 或 1 或左极端位的位是否对此有影响?

我想知道位视图中的过程是怎样的,尤其是转换。

对于整数提升,它总是可以毫无疑问地保存值和符号。

【问题讨论】:

  • bits 视图中没有多大意义,因为位模式在整数提升中几乎没有变化。
  • 它们总是用零位填充这是你想说的,它不是实现定义的吗? @EugeneSh。
  • 如果那是来自标准的(不是),引用段落等。只是链接一些网站是没有用的。这与标准有很大不同。另请注意,C 标准仅适用于 C11。
  • @Olaf:由于您对标准的了解比我多,您可以将网站中不符合标准的错误部分提供给我们。你绝对可以帮助我们。
  • 我认为纠正互联网上的任意网站不是我的任务。只需写他们应该 RTFS 标准的作者。

标签: c integer type-conversion


【解决方案1】:

如果您的无符号类型的等级小于它所使用的有符号类型并且它们具有不同的大小,则情况 4 适用。第 5 种情况,如果两者大小相同

例如,在我的系统上,int 是 32 位,long 是 64 位,long long 是 64 位。如果您有以下情况:

unsigned int a;      // range: 0 to 4294967295
long b;              // range: -9223372036854775808 to 9223372036854775807

unsigned long c;     // range: 0 to 18446744073709551615
long long d;         // range: -9223372036854775808 to 9223372036854775807

对于涉及ab 的表达式,即unsigned intlong,任何有效的unsigned int 都可以放入long。所以a 在这种情况下被转换为long

相反,对于涉及cd 的表达式,即unsigned longlong longlong long 不能包含unsigned long 的所有值。所以两个操作数都转换为unsigned long long

关于在位级别的提升/转换过程中发生的情况,我们首先假设较低级别的类型小于较高级别的类型,并且有符号类型使用 2 的补码表示。

对于从 32 位 int 到 64 位 long 的转换,如果值为正,则在左侧添加包含所有 0 位的 4 个字节。如果值为负,则在左侧添加包含所有 1 位的 4 个字节。例如,值5 的表示从0x00000005 更改为0x0000000000000005。对于值-5,表示形式从0xfffffffb 更改为0xfffffffffffffffb

【讨论】:

  • 第二个例子是情况 3。if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand 你可以看到 equal 也包括在内,unsigned long 和 @987654350 @拥有相同的转化排名!
  • 任何类型低于int 的转换等级都无关紧要:C11 标准草案 n1570:6.3.1.8 通常的算术转换 1 [讨论浮点] 否则,整数提升在两个操作数。然后将以下规则应用于提升的操作数:[...] 因此,在确定公共实数类型时,所有内容都为int 或更高。
  • 我完全同意这一点。先推广再转化。
  • @rondino 我已经更正了这两种情况以反映 cmets。
  • @rondino 正确。赋值时,将右边转换为左边的类型进行赋值,赋值表达式的类型就是左边的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 2014-03-10
  • 2016-03-12
  • 2011-05-05
相关资源
最近更新 更多