Objective c 为什么在C中,将一个大的double转换为long有时返回一个正值,而另一些时候返回一个负值?

Objective c 为什么在C中,将一个大的double转换为long有时返回一个正值,而另一些时候返回一个负值?,objective-c,c,casting,double,long-integer,Objective C,C,Casting,Double,Long Integer,我将其放入iOS测试用例中,并在(32位iPad)模拟器中运行: double whu = 3166323616091.220215; NSLog(@"Double: %f", whu); NSLog(@"Long: %ld", (long)whu); NSLog(@"Double: %f", 3166323616091.220215); NSLog(@"Long: %ld", (long)3166323616091.220215); 输出为: 2014-04-23 13:40:50.

我将其放入iOS测试用例中,并在(32位iPad)模拟器中运行:

double whu = 3166323616091.220215;
NSLog(@"Double: %f", whu);
NSLog(@"Long:   %ld", (long)whu);
NSLog(@"Double: %f", 3166323616091.220215);
NSLog(@"Long:   %ld", (long)3166323616091.220215);
输出为:

2014-04-23 13:40:50.904 xctest[53336:303] Double: 3166323616091.220215
2014-04-23 13:40:50.905 xctest[53336:303] Long:   -2147483648
2014-04-23 13:40:50.906 xctest[53336:303] Double: 3166323616091.220215
2014-04-23 13:40:50.907 xctest[53336:303] Long:   2147483647

我明白为什么它会将大的双精度值截断为长时间(32位)的最大值。但是为什么在强制转换文本返回正值时强制转换变量返回负值呢?事实上,我根本不明白为什么会返回负数。我是否遗漏了一些与精度有关的信息?

强制转换变量将导致运行时代码进行转换,并且产生的溢出将产生最大负数(0x8000000是一个未定义的结果,但此运行时正在执行的操作)。强制转换该常量将导致编译器转换该数字,并将其转换为最大正数(0x7FFFFFFF)。

就C而言,一个是未定义的行为(有符号整数溢出),另一个是实现定义的(转换为有符号).变量转换由运行时系统完成,文本由编译器完成。这两个问题都没有“好”的答案。一个给你0x7FFFFFFF,另一个给你0x8000000。当然!我已将代码更新为相当于
(long)MIN(whu,long\u MAX)
,以解决我的问题。我想这是正确的处理方法?@theory
(long)MAX(MIN(whu,long\u MAX),long\u MIN)
抓住两端。建议您调用自己的
双LongTODouble(long)
并封装此转换。chux:Yep,已经这样做了。谢谢@布拉德·布隆:想补充一个我可以接受的答案吗?