c语言类型转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言类型转换相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
main()
int a,b;
float f;
scanf("%d%d",&a,&b);
f=a/b;
printf("F=%f\n",f);

输入为 11 3

我是这样理解的:头文件,main函数
定义整型变量 a,b 单精度实型变量 f,并为a,b开辟2字节的内存地址,分别记为&a &b,为f开辟4字节的
内存地址记为&f
以十进制形式输入a,b
(scanf这里我是这样理解的:从键盘接收2个十进制的整型变量a,b 并把他们分别存放在&a &b中)
进行除法运算11/3=3(结果为整型变量),因为f为float型,所以自动转换为double型
因为它是要求以十进制形式输出双精度浮点数,所以输出F=3.000000
不知道我的理解对不对
如果以上都不变,就是将输出这里的
printf("F=%f\n",f)改成
printf("F=%d\n",f)
那么为什么输出会是0呢?
我的理解:因为f被自动转换成了double型
那么如果输出类型改变成十进制整型那么应该输出F=3啊?
难道不能连续改变数据类型?????
刚接触c语言没几天,如果问题比较低级还望耐心详细解答
先在此谢过了!!!

不要猜测,应该找一些资料看看。
在32位PC系统中,int型的3是0x00000003,在内存中占4个字节,分别是03,00,00,00
按照IEEE754浮点数表示标准,float型的3.0是0x40400000,在内存中占4个字节,分别是00,00,40,40
类似地,double型的3.0是0x0000000040080000,在内存中占8个字节,分别是00,00,08,40,00,00,00,00
如果用“%d”格式输出,在指定地址处读取2字节,然后按十进制整数解释输出,float和double型的3的前两个字节都是“00,00”,解释输出当然就是0了。
类似地,如果用“%d”把浮点型的3.0按十进制整型格式解释输出,得到1074266112的结果也应该可以理解了,这正是0x40080000的十进制值。

在处理float类型时还有一种情况,随编译器的浮点运算优化而不同。有时编译优化会对float型(不包括double类型)采用FPU中的浮点栈,按非“%f”的格式输出时就会引起数据读取的地址错误,因而得到一个随机的值,并引起后续输出错位。

有些结果一下想不清楚,在初学阶段只要知道是错误的就够了。
参考技术A 输出0只是错误的默认结果。

%d输出float型变量会输出一个错误的结果,并不是截取小数位后取整输出。因为整型和浮点型量在内存中的格式不同。
参考技术B 这两个函数的用意是,mian函数的参数都是按照标准格式main(int argc,char *argv[])来接收的,也叫命令行参数,所以,main接收的函数都是用字符形式存的。
有时候你的main想接收一个数字参数,所以你输入一个数比如 5,但是存储这个参数的时候,编译器就去查ASCII码表中字符5对应的ASCII值,而不是存入数字5。

所以,aoti就是把这个ASCII的5转换成数字5。itoa就是把实际的数字5转换成ASCII中的字符5。

所以,你说的这个把atoi和(char*)转换为int没有关系,atoi只管转换字符。

如果你想char *p,就是一个地址转换为int a,直接int a= p,即可。

buf[4]="1c",你是想把这个1c看做16进制转化成实际的16进制?

以上是关于c语言类型转换的主要内容,如果未能解决你的问题,请参考以下文章

C语言数据类型的转换

C语言自动类型转换

C语言举例说明啥情况下会发生自动类型转换

C语言自动转换类型

关于C语言数据类型转换的一个小问题,很简单哦!!

在c语言中数据类型转换主要有哪几种方式