c - 整数转换(显式和隐式转换)

标签 c casting

我环顾四周,只发现涉及指针的更复杂的帖子。我正在学习C,只是想确认我对几个例子的理解。 (这些示例假设 int 和 short int 大小分别为 32 位和 16 位。)

初始代码:

int int1 = 70000;
int int2;
short int shortInt1 = -70;
short int shortInt2, shortInt3;

还有一些示例转换:
shortInt2 = int1 / shortInt1;

我的理解:
一世。进行除法 (70000/-70),产生 -1000 的值
ii.因为 int 比 short int 具有更高的优先级,所以将结果分配给匿名签名 int
iii. Anonymous signed int 被强制转换为匿名 signed short int
iv.匿名签名的 short int 的值被赋值给 shortInt2
v.anonymous signed int 和anonymous signed short int 被垃圾回收
六。结果:-1000
shortInt3 = (short) int1 / shortInt1;

我的理解:
一世。因为强制转换优先于算术,所以 int1 被强制转换为匿名有符号短整数。发生溢出,值为 4464
ii.进行除法,将 -63 的结果分配给第二个匿名有符号短整数
iii.第二个匿名签名的 short int 的值被赋值给 shortInt3
iv.两个匿名签名的短整数都被垃圾收集
v. 结果:-63
int2 = (short)(int1 / shortInt2);

这是我最困惑的例子。我知道强制转换优先于算术,但在这里算术周围的括号似乎赋予了算术优先于强制转换的优先级。 (我认为这是有道理的,因为转换操作需要一些值来转换。)

所以,我的理解:
一世。执行除法,由于 int 具有更高的优先级,除法的值被分配给匿名签名 int。
ii.匿名签名的 int 被强制转换为匿名签名的 short int
iii.对匿名有符号短整数执行算术右移,将其扩展为另一个匿名有符号整数
iv.第二个匿名签名 int 的值分配给 int2
v.anonymous signed int(第一个)、anonymous signed short int和anonymous signed int(第二个)被垃圾回收
六。值:-1000

最佳答案

您的问题做出了许多不正确的假设并使用了不正确的术语。我将首先解释 C 标准对您的示例代码的说明。

您可以获取 C 标准的最新草案的副本,N1570 . “通常的算术转换”在第 6.3.1.8 节中描述;整数促销在 6.3.1.1 中描述。

int int1 = 70000;

鉴于您的假设,int是 32 位,所以它足以容纳值 70000 . (有些系统 int 仅为 16 位;在此类系统上,这将给出实现定义的结果。)
int int2;
short int shortInt1 = -70;
70int 类型的常量.一元 -运算符应用于结果值,产生 int值为-70。初始化导致 int要转换为目标对象类型的值。转换尽可能保留值,并且因为 short保证至少 16 位宽,shortInt1设置为明显的值。
short int shortInt2, shortInt3;

shortInt2 = int1 / shortInt1;

除法运算符将通常的算术转换应用于其两个操作数。这是一组适度复杂的规则,旨在保证两个操作数属于同一类型(在大多数情况下,C 没有混合类型的算术运算符)。这个案例相当简单:short int操作数转换为 int ,以及 /然后应用于两个 int操作数并产生 int结果。值为-1000 .

然后赋值导致结果从 int 转换。至short .再次,short大到足以容纳该值,所以 shortInt2获取值 -1000 (类型为 short ,而不是 int )。

C 中的大多数表达式都在不考虑它们出现的上下文的情况下进行计算。赋值右侧的除法不受左侧类型的影响。它被单独评估,然后在必要时转换为目标类型。
shortInt3 = (short) int1 / shortInt1;

转换转换 int1 的值输入 short ,所以 /运算符有两个 short 类型的操作数.但是对于整数操作数的常用算术转换包括整数提升,它同时转换 short要键入的操作数 int . int -by- int除法产生 int结果,然后转换为short并分配给 shortInt3 .
int2 = (short)(int1 / shortInt2);

事业部int1 / shortInt2应用通常的算术转换,从 short 转换右操作数至int . int 的结果-by- int然后转换为 short由 Actor 。 short然后将结果转换为 int因为它被分配给 int目标对象。

现在澄清你写的一些东西:

Because int has higher precedence than short int, the result is assigned to an anonymous signed int



类型没有优先级。运营商会。 (类型有等级,用于确定*通常的算术转换。)

您似乎假设评估表达式的结果必须分配给某个对象(变量)。事实并非如此。对表达式求值会产生结果。该结果是一个特定的值,并且是某种特定的类型,但它不需要存储在任何地方。 (也许它会临时存储在寄存器中,甚至是某个内存位置,但这是我们可以放心忽略的实现细节。)没有必要发明“匿名”任何东西来保存表达式的结果。结果简直就是。最终它可能被存储在一个对象中,或者传递给一个函数,或者用作另一个运算符的操作数。 C 标准没有定义完成的方式。

关于c - 整数转换(显式和隐式转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25961247/

相关文章:

vb.net - TryCast 翻倍?

C++、段错误和内存管理

c - 简单的C程序无法运行

javascript - HTML5 数据属性将 null 和 undefined 转换为字符串

c++ - C++程序在Visual Studio 2010中编译,但不能在Mingw中编译

java - 我必须创建 Long 实例才能将 Long 作为参数发送吗?

C++成员布局

c - c中多个范围之间的随机数

c - 如何将一个进程的标准输出重定向到另一个进程的标准输入?

c++ - GCC 不喜欢带有空格的 C++ 风格转换