繁体   English   中英

为什么在C中将较大的double转换为long有时返回正数,而其他时候返回负数?

[英]Why does casting a large double to a long sometimes return a positive and other times return a negative value in C?

我将其放入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

我知道为什么它将long的大double值截断为long(32位)的最大值。 但是,为什么在强制转换文字时返回正值时,强制转换变量返回负值? 实际上,我根本不理解为什么还会返回负数。 我是否错过了一些与精度有关的东西?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM