2011-06-07 84 views
0

不能理解数字是如何在C中处理的。任何人都可以指出一个好的教程。处理C中的数字

#include<stdio.h> 
main() 
{ 
    printf("%f",16.0/3.0); 
} 

此代码给:5.333333

#include<stdio.h> 
main() 
{ 
    printf("%d",16.0/3.0); 
} 

给出了一些垃圾值:1431655765

然后

#include<stdio.h> 
main() 
{ 
    int num; 
    num=16.0/3.0; 
    printf("%d",num); 
} 

给出:5

然后

#include<stdio.h> 
main() 
{ 
    float num; 
    num=16/3; 
    printf("%f",num); 
} 

给出:5.000000

回答

2

printf被声明为

int printf(const char *format, ...); 

的第一个参数(format)是字符串,其余的可以是任何东西。根据format中的格式说明符,将如何使用其余参数。如果您有:

printf("%d%c", x, y); 

x会INT对待,y将被视为char。 所以,

printf("%f",16.0/3.0); 

是好的,因为你问 浮动 双(%F),通过 浮动 双(16.0/3.0)

printf("%d",16.0/3.0); 

你问INT(%d ),则通过 float double(double和int具有不同的内部表示形式)所以,16.0/3.0(double)的位表示形式对应于1431655765(int)的位表示形式。

int num; 
num=16.0/3.0; 

编译器知道你正在分配给int并为你转换它。请注意,这与以前的情况不同。

+0

在''%f“,16.0/3.0'例子中,格式字符串指定了一个**'double' **,并且传递了一个'double'(常量'16.0'是一个'double ',即使你使用像'16.0f/3.0f'这样的'float'常量,结果会在传递给'printf'之前被提升为'double'。 – caf 2011-06-07 05:49:49

+0

@caf你说得对,我的错 – 2011-06-07 05:51:54

2

确定,所述第一1是给正确的值按预期方式。

第二个你传递一个浮点数的同时将它当作一个int处理(因此用于显示int数据类型的“%d”,解释为什么,因为它看起来你刚刚开始我会不用担心为什么“%d”在通过float时会这样做)读错了,因此会给你一个奇怪的值。 (虽然不是垃圾)。

第三个函数将16.0/3.0分配给一个int,同时将其分配给int数据类型,这将导致5.因为当使float为int时,无论舍入如何,它都会删除小数。

在第四个右手边(16/3)被视为一个整数,因为您的末尾没有.0零。它评估,然后分配5浮点数。因此解释了输出。

1

这是因为您选择的格式化字符串与您传递的参数不匹配。我建议看看printf上的文档。如果你有“%d”,它需要一个整数值,那么如何存储这个值是不相关的,并且可能与机器有关。如果你有一个“%f”,它需要一个浮点数,也可能取决于机器。如果你这样做:

printf("%f", <<integer>>); 

printf程序将寻找在那里你给一个整数一个浮点数,但它不知道它和Integer它只是看起来为字节的适当数量,并假设你有把正确的东西放在那里。

16.0/3.0 is a float 
int num = 16.0/3.0 is a float converted to an int 
16/3 is an int 
float num = 16/3 is an int converted to a float 

您可以在网上搜索printf文档。一页在http://linux.die.net/man/3/printf

0

printf将一些内存格式化为可读的字符串。如果你指定内存位应该被认为是一个浮点数,你将得到一个浮点数的正确表示;然而,如果你指定内存位应该被认为是一个整数并且它是一个浮点数,你会得到垃圾。

0
printf("%d",16.0/3.0); 

16.0/3.0结果是5.333333其在Single precision floating-point format表示如下

0 | 10101010 | 10101010101010101010101

如果将其读取为32位整数值,则结果为1431655765


num=16.0/3.0; 

相当于num = (int)(16.0/3.0)。这将float值(5.33333)的结果转换为整数(5)。


printf("%f",num); 

是相同printf("%f",(float)num);

1

您可以通过使用Implecit类型转换的概念理解用C号。

在评估任何表达式期间,它遵守非常严格的类型转换规则。 并且您的表达答案取决于此类型转换规则。

如果对象的类型不同,在操作进行之前,'lower'类型会自动转换为'higher'类型。 结果是更高的类型。

1: 所有被自动转换为INT然后

2: 如果操作数之一是INT并且另一个是浮子,所述INT转换为float因为float高于** int **。

如果你想了解更多关于隐式转换的信息,你必须参考书籍ANSI C编程E Balagurusamy

谢谢。 Bye:DeeP