在这个底层代码中:
#include<iostream>
#include<bitset>
#include<climits>
int main()
{
float j=9.03445; //Even double yields same result
int i={j};
std::cout <<sizeof(float)<<std::endl;
return 0;
}
为什么缩小转化率是因为float
和int
都是 4 字节?不应该丢失任何比特。
为什么这样可行:
float j=9.03445;
int i(j);
答案 0 :(得分:1)
int
无法存储非整数。因此,行int i{j};
有缩小(无论是sizeof(int)== sizeof(float)。这两种类型存储不同类型的数字。)
{}
语法不允许缩小,而()
语法可以缩小,这就是第二个示例编译的原因。在该示例中,i
将包含9(而不是9.03445),因此缩小。
答案 1 :(得分:1)
“缩小”这个词有点用词不当。 int i = 1; float f = {i};
正在缩小,float f = 1.0f; int i = {f};
也是如此!
以下是C ++ 14标准中缩小转换的确切定义:
缩小转化是隐式转化
- 从浮点类型到整数类型,或
- 从
long double
到double
或float
,或从double
到float
,除非源是常量表达式,转换后的实际值除外在可以表示的值范围内(即使它不能准确表示),或- 从整数类型或无范围枚举类型到浮点类型,除非源是常量表达式,转换后的实际值将适合目标类型,并在转换回原始值时生成原始值类型,或
- 从整数类型或未范围的枚举类型到不能表示原始类型的所有值的整数类型,除非源是一个常量表达式,其整数提升后的值将适合目标类型。
我通过将其视为任意技术术语而不是任何关于值中的位数或其他任何内容的实际陈述来解决这个问题。
在您的问题中,int i(j);
工作正常,因为在使用括号时允许缩小转换,但在使用花括号时则不允许。