c语言浮点数相等,c语言 浮点数转整型
混淆整数和浮点型,结果会很奇怪。
#包含stdio.h
int main(void)
{
浮动n1=3.0
双n2=3.0
long n3=2000000000
龙n4=1234567890
printf( % . 1e % . 1e % . 1e \ n ,n1,n2,n3,n4);
printf(%ld %ld\n ,n3,n4);
printf(%ld %ld %ld %ld \n ,n1,n2,n3,n4);
getchar();
返回0;
}
` ` c
在此插入代码片段。
输出的第一行显示%e转换显示整数没有转换成浮点。考虑如果使用%e转换指令打印n3(long)将会发生什么。首先,当printf()函数认为要打印时,%e转换显示要打印的值是double类型(本系统中double为8字节)。当peintf()查看n3(4字节)时,它还会查看n3的相邻4个字节,共8个字节单元。然后,它将8字节单元中的位组合解释为浮点数(例如,它将一些位组合解释为指数)。因此,即使n3的位数正确,根据%e转换描述和%ld转换描述解释的值也是不同的。最后的结果是一个没有意义的值。
第一行还解释了前面提到的内容:当用作printf()参数时,float类型的值将被转换为double类型。在这个系统中,dloat是4个字节,但是为了让printf()正确显示修改,n1被扩展到8个字节。
第2行的输出显示,只要使用正确的转换指令,printf()就可以打印n3和n4。
第3行的输出显示,如果printf()语句中存在其他不匹配,及时正确地使用转换描述也会产生错误的结果。使用%ld转换显示打印浮点数会失败,但是在这里,用%ld打印long类型的书也会失败。这涉及到一个叫做参数传递的概念。
printf("%ld%ld%ld%ld\n ",n1,n2,n3,n4);这个调用告诉计算机将变量n1、n2、n3和n4的值传递给程序。将程序传入的值放入称为堆栈的内存区域。根据计算机变量的类型(不是转换指令)将这些值放入堆栈。所以n1存放在堆栈中,占8个字节(float类型转换为douuble类型)。类似地,n2在堆栈中占用8个字节,而n3和n4分别在堆栈中占用4个字节。然后,控制传递给printf()函数。这个函数根据转换规范(不是根据变量类型)从堆栈中读取值。%ld转换指令指示printf()应读取4个字节,因此printf()读取堆栈中的前4个字节作为第一个值。这是n1的前半部分,它将被解释为long类型的整数。根据下一条%ld转换指令,printf()正在读取4个字节,这是n1的后半部分,将被解释为long类型的第二个整数。同样,n2的前半部分和后半部分按照3、4% LD,printf()读取,并解释为两个长整数。因此,对于n3和n4,即使转换描述是正确的,printf()也会读取错误的字节。
转载请联系作者取得授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。