将这些数据类型理解为基元
(int)char,(char)int是数据的解释。 (int)c给出该字符的整数值,(char)14返回由14编码的字符。
我一直都认为这是一个"内存解析",这样它只需要获取该位置的值,然后对其应用类型过滤器。
鉴于浮点存储为科学记数法的某种形式,存储在内存中的内容应该是垃圾作为整数。查看此实用程序http://www.h-schmidt.net/FloatConverter/IEEE754.html,似乎整个数字部分是分开的。
然而,由于这是在内存的较高部分,int cast如何知道"重新格式化"?编译器是否识别它是浮点数并应用特殊处理,或者进行了什么?
答案 0 :(得分:7)
你对演员表的理解是完全错误的。强制转换只是从一种类型到另一种类型的值转换的明确请求。它们不会重新解释一种类型的表示,就好像它有不同的类型一样。源代码:
float f = 42.5;
int x;
x = (int)f;
只是指示编译器生成将表达式f
的浮点值截断为整数的代码,并将结果存储在对象x
中。
答案 1 :(得分: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