首页 > 试题广场 >

有如下程序,该程序输出结果为?

[单选题]
如下程序
int main() {
    float a = 1;
    cout << boolalpha << ((int)a == (int &)a);
    float b = 0;
    cout << boolalpha << ((int)b == (int &)b);
}
该程序输出结果为()
  • truetrue
  • falsefalse
  • truefalse
  • falsetrue
推荐
答案D
解释:
理解(int&)b  是将b地址中对应的数据按照规定的int格式方式显示出来 
编辑于 2015-02-04 18:18:11 回复(0)
根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:
V =  (-1) S*M*2E
S代表符号位,E代表指数位,M代表有效数字位
IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M
其中 1≤M<2,就是说M只能是一点几几几,所以1可以省略,所以M事实上可以表示24位有效数字
因为E可以是整数,也可以是负数,所以将8位的E统一减去一个中位数127。
当E全为0时,表示该浮点数表示的是0,此时M不需加上1。
当E全为1时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。

注意,这里说的是二进制的表示形式,即
假如要表示7.0,其二进制为111.0 = (-1) 0*1.11*22
其中指数位为2表示右移两位

在本题中,float a = 1;
a可以表示为(-1) 0*1.0*20
S = 0,E = 0+127=127,M = 0(1省略),则在机器中表示为:
0 01111111 00……00(最后是23个0)
发表于 2017-06-29 19:58:45 回复(0)
(int &)b是将b地址中对应的数据按照规定的int格式方式显示出来
发表于 2022-05-14 14:36:08 回复(0)
深入理解浮点型的二进制表示方法, http://www.cnblogs.com/algorhythm/archive/2012/10/12/2721141.html
发表于 2015-09-08 10:46:49 回复(0)
求解释啊
发表于 2015-06-10 21:17:25 回复(0)

(int&)a:将a的引用强制转换为整型,意思是a所在的内存,本来定义的时候为float类型并初始为1.0f,但现在我要按int类型解释这段内存(也就是说a所在的内存地址中的数据本来是按float型存储表示的,你非要按int型来解释不可)。
1.0f   在内存中的存储为
0   011   1111   1   000   0000   0000   0000   0000   0000.
把他按整型数解释为2^29+2^28+2^27+2^26+2^25+2^24+2^23=1065353216

(int&)a 相当于*(int*)&a ,*(int*)(&a),*((int*)&a)  
(int)a   a在内存中的值转换成int类型   
发表于 2015-09-19 19:09:39 回复(5)
float a=1;
int b = (int) a;
int c = (int &)a;
浮点a的二进制表示方法为:0 01111111 00000000...(23位0)
(int)a 表示以浮点数a为参数构造整数(即float转换为int)
(int &)a 则是告诉编译器将a看成int对待(不做任何转换),所以(int &)a值为1065353216.
编辑于 2015-06-15 20:51:48 回复(3)
int main()
{
    float a=1;
    cout<<(int)a<<endl;
    cout<<(int &)a<<endl;
    float b=0;
    cout<<(int)b<<endl;
    cout<<(int &)b<<endl;
    return 0;
}
输出:
1
1065353216
0
0

发表于 2017-10-10 14:59:54 回复(0)
发表于 2018-08-21 19:31:38 回复(0)
求一个最通俗的解释
发表于 2017-01-07 11:26:43 回复(1)
以上程序的主要功能是比较 float 类型变量和该变量的地址所代表的整数型值是否相等。 具体的解释如下: - 在程序中,首先定义了两个 float 类型变量 a 和 b。其中 a 被赋值为 1,b 被赋值为0。 - 接着将 a 和 b 转换为 int 类型,并且使用引用方式将 a 和 b 的地址转换为 int & 类型,即取 a 和 b 的地址所代表的整数型值。 - 最后,通过 cout 输出两个比较表达式的布尔值,其中 boolalpha 表示以 true 和 false 的形式输出布尔值。 那么两个比较表达式的具体意义如下: - (int)a == (int&)a 表示将变量 a 强制转换为 int 类型后,再和 a 的地址所代表的整数型值进行比较。如果 a 的地址所代表的整数型值和强制转换为 int 类型后的值相等,则输出 true,否则输出 false。 - (int)b == (int&)b 表示将变量 b 强制转换为 int 类型后,再和 b 的地址所代表的整数型值进行比较。如果 b 的地址所代表的整数型值和强制转换为 int 类型后的值相等,则输出 true,否则输出 false。 需要注意的是,程序中的将 float 类型变量强制转换为 int 类型变量的做法存在风险,并非一个好的编程实践方式。这是因为在进行浮点数类型转换时,通常会遇到精度误差等问题,可能会导致最终比较结果不准确。
发表于 2023-10-09 12:10:33 回复(0)
(int) a 和 (int &) a 都是得到一个 int 类型的整数,不同的是 (int) a 是强制转换,即丢掉小数部分,保留整数部分;而 (int &) 则是把内存中的二进制数不再按浮点数格式读取,而是按整数格式读取(对于大多数计算机而言,浮点数是按照IEEE 754标准进行存储的)。
发表于 2022-03-21 10:26:41 回复(0)
(int)值不变,类型改变

(int &)机器代码不变,解释规则改变
发表于 2021-03-09 18:59:11 回复(0)
0在内存中的存储地址全为0
发表于 2020-04-10 21:38:33 回复(0)
参考:程序员面试宝典(第 5 版)5.4类型转换

发表于 2024-10-01 21:46:48 回复(0)
这题不严谨,编译是无法通过的:C语言中不能使用cout; 这里使用cout,那就默认你想用C++, 但头文件
<iostream>没有包含进来,另外没有使用using编译指令或using声明。
发表于 2023-05-02 23:42:20 回复(0)
发表于 2022-03-25 22:15:55 回复(0)
(int &)b 表示 按照int形式解释b的内存内容
类似于unsigned int 与int 之间的转换 就是解释方式不同
发表于 2022-03-11 09:08:31 回复(0)
答案为什么是D?  
发表于 2021-12-23 14:48:59 回复(0)
(int&)a是告诉编译器把a当做int型来对待,内存中没有做任何转换。
发表于 2020-10-24 20:13:25 回复(0)