C 带括号的强制类型转换

C 带括号的强制类型转换,c,type-conversion,C,Type Conversion,今天我发现了一些有趣而奇怪的事情 以下代码的输出为: 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_

今天我发现了一些有趣而奇怪的事情

以下代码的输出为:

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;
}
在表达式
(long)(a*b)
中,
(a*b)
int
类型。转换为
long
的时间太晚,并且由于您在平台上溢出
int
类型,程序的行为未定义

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


在某些平台上仍然存在
long
溢出的危险;考虑使用<代码>长long <代码>可移植性。

那么是“返回(long)”a*b;“唯一的方式和最好的方法来将int类型“a*b”转换为long类型?我更喜欢<代码>返回1L*a*b;<代码>。。。或者
1L
,因为它在视觉上比
1L
更独特@Bathsheba谢谢。