【问题标题】:Casting to an unsigned int, then casting back, C转换为无符号整数,然后转换回 C
【发布时间】:2012-01-11 15:36:20
【问题描述】:

如果我有一个堆栈 S,里面装满了带符号的整数,我想执行以下操作: 弹出两个值并将其转换为无符号整数,然后将它们加在一起,然后推回一个有符号的总和。 我做了以下,但我不知道它是否正确:

unsigned int x = (unsigned int)pop(S)
unsigned int y = (unsigned int)pop(S)
int sum = x+y
push(S, sum);
pc++

我在正确的轨道上吗? 另外,有人可以向我解释一下显式转换吗? 谢谢。

【问题讨论】:

  • 你为什么需要投射?
  • pop(S) 返回什么类型?
  • pop 返回一个 32 位整数

标签: c stack int unsigned


【解决方案1】:

您是正确的,因为您的代码完全按照您所说的去做。真正的问题是这是否是您想要实现的目标。

转换为 unsigned int 的负数会变成一个非常大的正数。例如,在强制转换为无符号后,负数成为最大的正整数,可以用无符号整数表示(试试看!)当您将两个被强制转换为无符号的负数相加时,您肯定会发生溢出。如果这确实是您想要做的,那么您的代码肯定会这样做。

【讨论】:

  • 是的,我正在尝试这样做。但是每当我 printf("%d\n", x) 例如,它仍然给我一个有符号整数,这就是为什么我不知道我正在做的事情是否有效。
  • @de1337ed 这是因为您需要告诉 printf 不要将未签名的内容重新转换为已签名的:printf("%u\n", x)
  • 即使不加,也会溢出。以下调用实现定义的行为:(int)(unsigned int)-1.
  • 您不能相信 printf 告诉您的内容,因为将格式字符串中的类型与传入参数中的类型匹配是愚蠢的。您可以传入一个浮点数并尝试使用 %d 打印它,而 printf 会很乐意尝试。尝试使用“%u\n”打印。
  • 这是有道理的。另一个快速的问题,我需要做 unsigned int x = (unsigned int)pop(S) 还是 unsigned int x = pop(S) 就足够了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
相关资源
最近更新 更多