//最初的情形
#include <stdio.h>
int main()
{
int a=3;
double b=1;
b=1/a;
printf("%-15d%-15d%-15f%-15f",1/a,b,1/a,b);
}
输出结果:0 0 0.000000 0.000000
//第二次的情况
#include <stdio.h>
int main()
{
int a=3;
double b=1;
b=1/a;
printf("%-15d%-15d%-15f%-15f",1.0/a,b,1.0/a,b);
}
输出结果:1431655765 1070945621 0.000000 0.333333
请问前两个数据时怎么来的,1.0/a发生了强制转换,但b为什么会改变?另外对于输出的第三个数据,C语言在已经发生强制转换的情况下为什么不能用浮点型的格式符输出?
//第三次修改
#include <stdio.h>
int main()
{
int a=3;
double b=1;
b=1.0/a;
printf("%-15d%-15d%-15f%-15f",1/a,b,1/a,b);
}
输出结果:0 1431655765 0.000000 0.333333
第二个数据怎么来的?
//第四次修改
#include <stdio.h>
int main()
{
int a=3;
double b=1;
b=1.0/a;
printf("%-15d%-15d%-15f%-15f",1.0/a,b,1.0/a,b);
}
输出结果:1431655765 1070945621 0.333333 0.333333
这次为什么第三个数据可以正常输出了?第一、二个数据怎么来的?
你的意思是输出时虽然可以以不同格式输出,但并不是进行了强制转换,仅仅是按照不同数据类型的字节数来从栈中取,对吧?
我之前是受97可以用%c输出'a'误导,以为这是强制转换的一种形式,这样分析的话
printf("%c\n%c",97); //之所以会输出的一个'a'和一个空,正是由于97保存为4字节long,取出了其中的一个字节'a' 和一个字节空输出,对吧?
如果我想弄清它每个二进制位进栈和出栈的顺序,这是属于编译原理的内容吗?
是的,我在windows上测试的,char是会转成int类型的,所以也是取4个字节;故在不定个数参数的函数里面,对参数的解析都要做相应转换,基本类型只能取4个字节,8个字节等,也是为了对齐吧;如果没有这些所谓的类型提升,会导致很多bug出现的对于不定个数的参数函数来说;自己可以测试一下;
函数进栈顺序是先是函数参数,然后是返回地址,然后是代码段;栈是高到低存放;
关于C语言的整型和浮点型之间的强制转换与输出格式符问题
1:这里涉及到函数进栈时的,不定参数转换问题,float,double类型的,进栈的时候都是按double计算的,8个字节;所以不管参数里面是%f,还是%lf都是按8个字节取的,然后强制转换为f;\/\/第二次的情况 int a=3;double b=1;b=1\/a;printf("%-15d%-15d%-15f%-15f",1.0\/a,b,1.0\/a,b);...
c语言中,整型除整型得到浮点型,赋给整型变量,要强制转换吗?
整型除以整型是取整除,得不到浮点型数据。比如int a=4,b=5则a\/b=0,要想得到a\/b=0.8必须把其中之一强制为float型,如(float)a\/b=0.8或a\/(float)b=0.8。把整型数直接赋给浮点型变量要告警,不算大错……
C语言强制类型转换问题
因为你的a定义的是int类型,所以1\/a和1\/2并没有不同,计算结果都是0.5再取整,就变成了0.0。如果你定义为double类型,那就是0.5,转成double还是0.5 一般C语言中,整数如果要使用浮点数计算,需要加个小数,比如1\/2,应该改为1.0\/2。这样中间过程中就会使用浮点数,结果就会是0.500000 ...
C语言printf函数,float浮点数int整形数类型转换问题!!?
printf 是有格式输出。输出的变量类型 与 格式 必须相配。 bbb 是 float, 按 %d 输出 就会出错,你的例子 正说明这点,它不但自己错,而且引起输出流错。按 %d 输出,要加 (int) :printf("%d\\n%f\\n%f\\n",(int) bbb,(float)aaa,2.3);
c语言整型与浮点型数据间的运算
在C语言中,整型与浮点型数据间的运算结果取决于运算类型转换。若希望得到结果为1.000000,可以执行(float)n\/b。这里,n为整型变量,b为整型变量,(float)为类型转换符,将n转换为浮点型后与b进行除法运算。这样可以确保运算结果为浮点型,并得到期望的精确结果。若期望得到结果为1.250000,应使用 ...
c语言中定义了整型数据但是输出的时候我把它调为浮点型,运行输出了不是...
printf("b=%f,a=%d\\n", (float)b, (int)a); 原因很简单,格式串中的 %f 要求对应的参数必须是浮点型,否则输出就不正确。你已经看到了,输出是 b=0.000000,不正确吧?整型数据调为浮点型必须使用 (float)b,而不是改一下格式串为 %f 就能做到的。
c语言浮点数与整型的比较问题。
表达式的数据类型是float型,因为这个表达式的意思是,如果fri等于m则输出fri,不等就输出m,显然他们不相等,所以输出的是m,而m的类型是float型,所以是单精度
keil中 c语言中的强制转换符问题
将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。(2) 单、双精度浮点型 ● 由于C语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为doub1e型数据参加运算,然后直接赋值。doub1e型数据转换为float型...
C语言关于int变成float
定义的数据类型不一样!int和float的数据宽度都不一样!要么就强制转换!但是强制转换也会出错!因为int不能强制转换成float!float的位宽比int长
c语言强制类型转换
解释如下:C语言中的强制类型转换是一种显式地改变数据类型的方式。这种转换通常在需要将一种类型的数据转换为另一种类型时使用。在C语言中,强制类型转换的语法是使用括号将目标类型包围起来,然后将要转换的变量或值放在括号后面。例如,将整型变量转换为浮点型可以使用如下语法:float myFloat = myInt;...