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谢谢。