【问题标题】:forced type conversion with parentheses带括号的强制类型转换
【发布时间】:2018-09-30 00:43:09
【问题描述】:

今天我发现了一些有趣而奇怪的东西。

下面代码的输出是:

410065408
9000000000

我发现带括号的“强制类型转换”是错误的。 我猜return (long) (a * b) 等于return (long) ((int) a * b)

410065408(int) 的转换还是410065408(long)。

我说的对吗?

int main(int argc, char *argv[])
{
  int a = 100000, b = 90000;
  printf("%ld\n%ld\n", product_wrong(a, b), product_right(a, b));
  return 0;
}

long product_wrong(int a, int b)
{
  return (long) (a * b);
}


long product_right(int a, int b)
{
  return (long) a * b;
}

【问题讨论】:

    标签: c type-conversion


    【解决方案1】:

    在表达式(long) (a * b) 中,(a * b)int 类型。转换为 long 发生得太晚了,您的程序的行为是未定义,因为您在平台上溢出了 int 类型。

    (long)a * b 被分组为((long)a) * b,因此b 被提升为long

    仍然在某些平台上存在long 溢出的危险;考虑使用long long 以实现可移植性。

    【讨论】:

    • “return (long) a * b;”也是如此将 int "a * b" 类型转换为 long 类型的唯一方法和最佳方法?
    • 我更喜欢return 1l * a * b;
    • ...或1L,因为它比1l更具视觉特色。
    • @Bathsheba 谢谢。
    猜你喜欢
    • 2014-01-12
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多