首页 > 试题广场 >

假定变量i、f和d的数据类型分别为int、float和dou

[单选题]
假定变量i、f和d的数据类型分别为int、float和double(int用补码表示,float和double分别用IEEE754单精度和双精度浮点数格式表示),已知i=785,f=1.5678e3,d=1.5e100。若在32位机器中执行下列关系表达式,则结果为“真”的是()

Ⅰ.i==(int)(float)i                    Ⅱ.f==(float)(int)f

Ⅲ.f==(float)(double)f                Ⅳ.(d+f)-d==f


  • 仅Ⅰ和Ⅱ
  • 仅Ⅰ和Ⅲ
  • 仅Ⅱ和Ⅲ
  • 仅Ⅲ和Ⅳ
推荐

题中三种数据类型的精度从低到高为int->float->double,从低到高的转换通常可以保持其值不变,I和III正确,而从高到低的转换可能会有数据的舍入,从而损失精度。对于II,先将float型的f转换为int型,小数点后的数位丢失,故其结果不为真。对于IV,初看似乎没有问题,但浮点运算d+f时需要对阶,对阶后f的尾数有效位被舍去而变为0,故d+f仍然为d,再减去d后结果为0,故IV结果不为真。

此外,根据不同类型数据混合运算的“类型提升”原则,在IV中,等号左端的类型为double型,结果不为真。

发表于 2018-09-03 20:30:26 回复(2)
Ⅰ.i==(int)(float)i i值先扩充成float,精度增大,然后再减小,此时数值和i相等
Ⅱ.f==(float)(int)f f值先强转成int,此时精度减少,存在数据丢失,再强转成float,已经丢失的数据找不回来了

Ⅲ.f==(float)(double)f 同理Ⅰ,精度先增大,数据不丢失,再减少仍然相等;
Ⅳ.(d+f)-d==f 浮点运算d+f时需要对阶,对阶后f的尾数有效位被舍去而变为0,故d+f仍然为d,再减去d后结果为0
发表于 2022-01-17 10:12:11 回复(0)
Ⅳ 两个不同精度的数运算时会向高精度的转换 float 和 double 相加时会有对阶操作 低阶向高阶看齐 e3 向 e100 对齐时 需要向右移动的数符位数远大于ieee中double的位数 相当于 (d+0)-d = 0
发表于 2021-03-12 20:13:50 回复(0)
类型就是个容器,装满水的浴缸往杯子里倒水,就会溢出,就是精度丢失。
发表于 2023-01-05 12:44:23 回复(0)

自动类型转换规则:

  • 如果两个操作数的类型不同,C语言会自动将较低精度的操作数转换为较高精度的类型,然后再进行运算。
  • 整数类型之间的自动转换按照以下顺序:char -> short -> int -> unsigned int -> long -> unsigned long -> float -> double。
  • 浮点数类型之间的自动转换按照以下顺序:float -> double。

需要注意的是,自动类型转换可能会导致精度损失或溢出问题,因此在进行精确计算时,应该使用适当的数据类型,并进行显式的类型转换。

发表于 2023-09-16 17:48:01 回复(0)
答案为B,仅1和3
发表于 2022-10-12 11:41:24 回复(0)
往大的转,数值不变;往小的转,基本会变。
发表于 2021-12-11 20:17:49 回复(0)
往大转,数值是不变的;往小转,一般会变~
发表于 2021-05-22 11:40:40 回复(0)
类型转换: 从高到低会丢失精度
发表于 2020-09-25 08:41:20 回复(0)