为什么(int)float == float.truncate而不是垃圾(铸造实际上如何工作?)

Cap*_*nny 1 c

将这些数据类型理解为原语

(int)char,和(char)int是数据的解释.(int)c给出该字符的整数值,(char)14返回由14编码的字符.

我总是把它理解为"内存解析",这样它只需要取得该位置的值,然后对其应用类型过滤器.

鉴于浮点存储为科学记数法的某种形式,存储在内存中的内容应该是垃圾作为整数.查看此实用程序http://www.h-schmidt.net/FloatConverter/IEEE754.html似乎整个数字部分是分开的.

但是,由于这是在内存的较高部分,int cast如何知道"重新格式化"?编译器是否识别它是浮点数并应用特殊处理,或者发生了什么?

R..*_*R.. 7

你对演员表的理解是完全错误的.强制转换只是对从一种类型到另一种类型的值转换的显式请求.它们不会重新解释一种类型的表示,就好像它有不同的类型一样.源代码:

float f = 42.5;
int x;
x = (int)f;
Run Code Online (Sandbox Code Playgroud)

只是指示编译器生成将表达式的浮点值截断为f整数并将结果存储在对象中的代码x.


R S*_*ahu 7

我总是把它理解为"内存解析",这样它只需要取得该位置的值,然后对其应用类型过滤器.

这是一个错误的理解.

该语言指定基本算术类型之间的转换.在网络上查找"常用算术转换".你会发现很多描述它的链接.为了将浮点类型转换为整数类型,这就是C99标准所说的:

6.3.1.4实数浮点数和整数

1当实数浮动类型的有限值转换为除了以外的整数类型时_Bool,小数部分被丢弃(即,该值被截断为零).如果整数部分的值不能用整数类型表示,则行为是未定义的.

float f = 4.5;
int i = (int); // i is 4

f = -6.3;
i = (int)f;    // i is -6
Run Code Online (Sandbox Code Playgroud)