c语言float转double,小数默认为double,那么float a=1.5要不要在1.5后面加f

为什么float a=4.3;是错的呢,一定要在后面加上f?而double类型不用加d也可以_百度知道
为什么float a=4.3;是错的呢,一定要在后面加上f?而double类型不用加d也可以
3;这也是正确的?;是错的呢,一定要在后面加上f?而double类型不用加d也可以,甚至double b=9.?或者double n=9;也是正确的呢为什么float a=4
我是在Eclipse集成开发环境写的,写上去就报错了
我有更好的答案
单纯赋值没错啊 只是警告吧
小数默认解析为double 这样就是double向float赋值 会警告吧 而double a=9;是低类型向高类型赋值是没有问题 因为没有精确度达到了
采纳率:18%
这是编译器的特性,不过所有的编译器都是按照如下方式处理的,由于小数的表示方法遵循的是IEEE754标准,其中对于尾数部分的长度有不同的规定,如果你对于float类型不加上f的,默认就按照特定的解析方式,自然就会导致数据的精度不如预期
不用加f,肯定是其他的原因。有时候这样的错误是因为某个地方书写的问题,比如.是不是写成了“。”,;是不是用的中文的;多找找这样的原因。要相信计算机,规定了的东西,计算机是不会错的。
要加f/F,这是规定
其他1条回答
为您推荐:
其他类似问题
float的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。java里面为什么定义float类型时必须加f,定制符又是什么意思?_百度知道
该问题可能描述不清,建议你
java里面为什么定义float类型时必须加f,定制符又是什么意思?
我有更好的答案
对于编译器来讲,你如果只写上一个常量的小数,他是不是到类型到底是什么的,所以会把它当成double类型,加上f就告诉编译器这个数是float类型
定制符就是实现这功能的符号、   Spring等)实现快速开发.5e - 45~ 3.4e + 38。对于一个小数其默认类型为double型,如果需要指定为float型,需要在小数后面添加F或f后缀,可以自动生成应用软件模板代码,定制并管理自己的J2EE代码模板,代码生成模板支持最流行的实用Java开发框架(如hibernate。,这是规定。Toolsfloat类型中小数位数为7位,即可精确到小数点后7位,表示范围为1
java中 整数默认为int,小数默认为double
为您推荐:
其他类似问题
您可能关注的内容
float的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C语言程序设计(第二版)-电子教案-丁亚涛 第2章 数据类型、运算符和表达式- 道客巴巴
第2章 数据类型、 运算符和表达式第2章 数据类型、 运算符和表达式
& 掌握C语言的基本数据类型& 掌握标识符、 关键字、 常量和变量的使用掌握运算符表达式以及数据类型之间的转换等& 掌握运算符、 表达式以及数据类型之间的转换等& 掌握简单数据的输入输出
数据类型& 2. 1. 1
数据类型概述
数据类型& 2. 1. 2
整数类型& 整数类型简称整型, 整型数据没有小数部分。& 整型可分为:& 基本整型: 用int表示& 基本整型: 用int表示。& 短整型: 用short int或short表示。& 长整型: 用long int或long表示。
数据类型& 2. 1. 2
整数类型& 注意:& 除了 单个的0是十进制常量外, 其他以0开始的都是八进制常量& 数据后加u或U: 表示是无符号类型, 如65535u、 168U数据后加l或表示是长整型& 数据后加l或L: 表示是长整型, 如-1L& 八进制、 十进制和十六进制只是整数的不同书写形式,提供多种写法只是为了 使用方便, 我们可以根据需要选择适当的书写方式& C语言中不用二进制形式表示整数& C语言中, 八进制和十六进制数一般是无符号的如
整型常量& 十进制整型常量: 同数学上的表示方法, 如168、-1、 65535等。& 八进制整型常量: 以0开头, 由数字0~7组成,如0101、 -045等。& 十六进制整型常量: 以0x或0X开头的数字序列表示十六进制数, 如0x12,
整型常量& 以下是非法的整型常量:& 09: 0开头应该是八进制, 但9不是合法的八进制数字。& 0X6G: 0X开头应该是十六进制, 但G不是合法的十六进制数字十六进制数字。& 以下是合法的整型常量:& : 八进制, 相当于十进制的65。& -012: 八进制, 相当于十进制的-10。& 65535LU: 十进制, 无符号长整型。& 0XFF: 十六进制, 相当于十进制的255。
整型常量& 注意:& 如要说明是无符号类型则在数据后加u或U、 如65535u、168U等。 如果说明为长整型, 则在数据后面加l或L, 如-1L。& 八进制、 十进制和十六进制只是整数的不同书写形式,提供多种写法只是为了 使用方便, 我们可以根据需要选择适当的书写方式。& C语言中不用二进制形式表示整数。& C语言中, 一般只使用无符号的八进制和十六进制数, 而不使用有符号的八进制和十六进制数, 因此没有专门的无符号八进制和十六进制标识符。
数据类型& 2. 1. 3
实型& 实数类型简称实型, 有时又称浮点数据类型& 包括 :& 单精度浮点数类型: 简称浮点类型& 单精度浮点数类型: 简称浮点类型, 类型名为float。& 双精度浮点数类型: 简称双精度类型, 类型名为double。& 长双精度类型: 类型名为long double。类型名为
数据类型& 2. 1. 3
实型常量& 实型常量只能用十进制形式表示& 表示形式:& 小数形式。 由数字序列和小数点组成, 如3
153. . 15、 . 15、 2. 等都是合法的实型常量。& 指数形式。 由十进制数加上阶码标志&e&或&E& 及阶码组成, 如3. 14e-4或3. 14E-4表示3. 14&10-4。152 等都是合法的
实型常量& 注意:& 字母e或E之前的尾数部分必须有数字, 例如E2是不合法的。& e或E后面的指数部分必须是整数, 指数部分无整e或E后面的指数部分必须是整数, 指数部分无整数或为小数均是错误的, 例如5e 和5E-5. 5均是不合法的表示。& C语言中, 默认实型常量为double类型, 若有后缀&f& 或&F& , 则为float类型。
有效数字【例2-1】 一个浮点数的精确度测试实验#include &stdio. h&void main(){float x=0. 875;float y=0. ;printf(&x=%. 15f\n&, x) ;
/* %. 15f表示输出15小数*/printf(&y=%. 8f\n&, y) ;}
数据类型& 2. 1. 4
字符型& 字符类型的数据简称字符型数据& C语言中用char表示, 在内存中占一个字节。& 字符类型的数据包括计算机所用编码字符集中的& 字符类型的数据包括计算机所用编码字符集中的所有字符。 常用的ASCII字符集, 共128个。 扩展的ASCII字符集共256个字符。& 字符数据与整型数据是相似的 (除了 占用的存储空间不同 )
数据类型& 2. 1. 4
字符常量& 字符型常量是由一对单引号括起来的单个字符构成& 例如' A' 、 ' b' 、 ' 8& 字符&A& ~&Z& 的ASCII码值是65~90& 字符A~Z的ASCII码值是65~90。& 字符&a& ~&z& 的ASCII码值是97~122。& 字符&0& ~&9& 的ASCII码值是48~57。& 空格字符' □' 的ASCII码值是32。
字符串常量& 字符串常量是由一对双引号括起的字符序列,例如&1234567& 、 &Hello World& 等都是字符串常量。& &\\123\101&共有5个字符占6个字节& \\123\101 共有5个字符占6个字节, 其中\\、\101分别代表一个字符, 输出为\123A其中\\
标识符、 符号常量与变量& 2. 2. 1 标识符& 所谓标识符是指程序中的变量、 符号常量、 数组、 函数、类型、 文件等对象的名字。规 则说 明只能由下划线只能由下划线、 数字与字母构成, 首个字符必须是字母或下划线, 而不能是数字或其他符号数字与字母构成首如如: name、 Name、 score、 _10注意C语言中对字母大小写敏感nameNamescore10不能使用系统的关键字(保留字)如: int、 float、 double等不建议使用系统预定义标识符如预编译命令名(define、 include) 、 系统函数名(scanf、 printf、 getchar、putchar)尽量做到&见名知义&如: max、 name等, 而不用像abc、 a1、a2等标识符避免使用易混字符如: 1、 l、 i; 0、 o; 2、 z等
标识符、 符号常量与变量& 关键字
标识符、 符号常量与变量& 2. 2. 2 符号常量【例2-2】 输入圆的半径, 计算周长和面积。#define
PI3. 14159void main(){{
float r, c,
scanf(&%f&, &r) ;c=2*PI*r;s=PI*r*r;
printf(&r=%f, c=%f, s=%f\n&, r, c, s) ;
标识符、 符号常量与变量& 2. 2. 3 变量& 在程序运行过程中, 其存储的值可以被改变的量称为变量& 变量必须通过标识符进行说明, 称为变量名。变量必须通过标识符进行说明, 称为变量名。& 变量名和内存单元地址存在映射关系, 程序可以通过变量名寻址, 从而访问其存储的数据。
标识符、 符号常量与变量& 变量的定义和说明& 数据类型变量名1[, 变量名2, &, 变量名n] ;
& inti, j,&& long a, b,
& 4个基本要素: 名字、 类型、 初值和作用域
标识符、 符号常量与变量& 变量名为标识符的一种。& 变量的数据类型可以是基本数据类型, 也可以是复杂数据类型。& 变量的作用域是指变量在程序中有定义的范围, 即变量的作用域是指变量在程序中有定义的范围, 即该变量名在某段代码区域是否有意义。& 变量需要赋初值。 没有被赋值的变量其初值取决于存储类型, 静态存储的变量将自 动为0, 否则被随机初始化。
标识符、 符号常量与变量& 变量赋初值的两种方式& 变量说明时直接赋初值, 称为变量的初始化, 如:& int a=10, b=9, c=6;flt& float x=3. 0, y=1. 0, z=2. 0;& 用赋值语句赋初值, 如:3 01 02 0&& x=10. 0;
标识符、 符号常量与变量& 注意:& 编译系统将对每一个变量根据它被定义的类型分配相应的存储单元。 变量存储单元地址可用&&变量名& 求得。以用长度运算符& 可以用长度运算符sizeof() 求出任意类型变量存储单元的字节数。& 编译系统根据变量被定义的类型检查该变量进行运算的合法性。& 如果没有给变量赋初始值, 普通变量将存储随机值, 直到给它赋值为止。() 求出任意类型变量存
标识符、 符号常量与变量& 整型数据的存储& C语言中的整型数据分为有符号和无符号两大类& unsigned int a=65, b=65535;& int a=65,b=32767,c=-1 ;
标识符、 符号常量与变量& 补码(complement)& 假设int型整数a占2字节, 16位二进制数
标识符、 符号常量与变量& 2字节的int型整数的补码
标识符、 符号常量与变量& 负数的转换步骤如下:& 32768& 取绝对值, 如| -32768|
等于3| |如216| 32768| 等于6-| a| , 如216-| -32768|
等于6 等于 32768& 转换成二进制, 如0等于215)
标识符、 符号常量与变量& 补码形式还原成十进制的步骤正好相反& 11110& 转换成十进制: 4 ?
? 2& 216-65534 ?
? 2& 加负号 ? -2
标识符、 符号常量与变量& 实型数据的存储
实型变量及实型数据的存储& 为了 扩大表示数的范围, 实型数据是按指数形式存储的, 存储格式如下图所示:
字符数据的存储与使用字符'A'的存储
【例2-3】 演示字符数据的存储和引用#include &stdio. h&void main(){
c=' A' ;i=c;
printf(&c =%d, c= %c\n&,
c) ;printf(&i =%d, i= %c\n&,
i) ;c=c+32;
printf(&c=%c\n&, c) ;c=0x80;
printf(&c=%c, c=%d\n&,
运算符与表达式& 13类45个运算符优先级运算符名称结合方向1()括号, 改变优先级从左至右[ ]数组下标. 、 \-&成员选择运算符++++ 、 --自增自增、 自减运算符自减运算符2从右至左&取地址*取内容!逻辑求反~按位求反+、 -正、 负号(数据类型)强制转换sizeof()计算数据类型长度
运算符与表达式3*、 /、 %乘法、 除法、 求余从左至右4+、 -加、 减5&&、 &&左移、 右移6& 、 &=、 &、 = &小于、 小于等于、 大于、 大于等于7==、 !=等于、 不等于8&按位与按位与9^按位异或1 0|按位或11&&逻辑与1 2||逻辑或1 3?:条件运算符从右至左1 4=、 +=、 -=、 *=、 /=、 %=、&&= 、 &&=、 &=、 &=、|=赋值运算符从右至左1 5,逗号运算符从左至右
& 运算符的功能。& 运算符与操作对象即操作数(包括常量、 变量、 函数调用等) 的关系:& 操作数的个数(单目、 双目、 三目) 。& 求操作数的类型(如求余运算符%要求操作数是整型) 。求操作数的类型(如求余运算符%要求操作数是整型) 。& 结合方向& 运算符的优先级。& 运算结果的数据类型& 运算符连接操作数形成的式子叫表达式。学习运算符要注意以下几方面问题
算术运算符与算术表达式1. 基本算术运算符& +(加) 、 -(减) 、 *(乘) 、 /(除) 、 %(取模,或称求余运算符) 。& 双目运算符, 结合方向均为从左到右。& %(取模) 运算符仅用于整型变量或整型常量的运算,%b结果为 除以b的余数a%b结果为a除以b的余数, 余数的符号与被除数相同,如: 7%3的值为1; 17%-3的结果为2; -19%4的结果为-3。& +、 -、 *、 /运算符的两个操作数既可以是整数, 也可以是实数。& /(除法) 运算符, 当对两个整型的数据相除时为整除操作2. 基本算术表达式余数的符号与被除数相同
运算符与表达式& 强制类型转换(显式转换) 运算符: (类型)& 例如:& (double) a& (int) (x+y)& (flt) 5/3& (float) 5/3& 表达式一定要加括号(因强制类型转换是单目运算, 优先级高) , 例如上面最后一个表达式中只是将5转变成float型, 而不是将5/3转变成float型。& 若对变量实型显式转换, 将得到新类型的一个值, 原变量的类型及其存储值均不变。
运算符与表达式【例2-5】 演示强制类型转换。#include &stdio. h&void main(){f=3. 1415926;i=(int)
printf(&i=%d\n&, i) ;f=5/3;f=(float) 5/3; printf(&f=%f\n&, f) ;printf(&f=%d\n&, f) ;
/*实数按整型数方式输出*/printf(&i=%f\n&, i) ;
/*整型按实数方式输出*/}printf(&i=%d, f=%f\n&, i, f) ;printf(&f=%f\n&, f) ;
算术运算符与算术表达式3. 自增自减运算符: ++ 和 && 单目运算符, 右结合& 作用对象必须是变量& 前缀运算& int i=5,& 后缀运算j=++i;
? j等于6。& int i=5,j=i++;
? j等于5。
运算符与表达式【例2-4】 输出下面程序中i、 j的值。#include &stdio. h&void main(){ int i=5,
j=++i + i++;i=5; j=(++i) +(++i) +(i++) ;i 5i=5;
printf( i++=%d, i++=%d\n , i++, i++) ;
printf(&i=%d\n&, i) ;i=5;printf(&++i=%d, ++i=%d\n&, ++i, ++i) ;
printf(&i=%d\n&, i) ;i=5; j=6; printf(&i+j=%d, j++=%d\n&, i+j, j++) ;printf(&i=%d, j=%d\n&, i, j) ;i=5; j=6;printf(&i+j=%d, j++=%d\n&, i+j, ++j) ;printf(&i=%d, j=%d\n&, i, j) ;}printf(&i=%d, j=%d\n&, i, j) ;printf(&i=%d, j=%d\n&, i, j) ;i tf(&i++ %d i++ %d\ & i++ i++)
运算符与表达式& 说明:& 左边是TC下的运行结果, 右边是VC下的运行结果。& 二者不同之处在于printf函数输出时, VC下后面参数的后缀j++、 i++是在所有参数处理完毕后才起作用, 而TC下, 后缀的自增和自减将影响到该参数前面的参数处理。
运算符与表达式& 2. 3. 2
算术表达式的书写) 1( ?nn2n*(n+1)/22bb4ac? ??(-b+sqrt(b*b-4*a*c)) / (2*a)( b+sqrt(b b 4 a c)) / (2 a)2+sqrt(1.0+a)*b++2a/2&2+sqrt(4.0)*b++/2&2+2.0*2/2&2+4.0/2&2+2.0&4.0
运算符与表达式& 2. 3. 3
赋值运算符与赋值表达式& 变量 = 表达式& &=& 是赋值运算符, 不同于等号(等号是==) 。& 右结合& int a, a=b=100;连续赋值只有最后& 连续赋值, 只有最后一步有效。 例如:& a=100; a=200;& 赋值运算符的优先级较低(只高于逗号运算符) , 因此一般情况下表达式无须加括号。 例如:& a=2+5/3 相当于: a=(2+5/3)& 赋值运算可以构成一个表达式, 其值可以再赋给其他变量。 例如:& a=b=100; 其实相当于:步有效例如a=(b=100) ;
运算符与表达式& 复合赋值运算符& +=、 -=、 *=、 /=、 %=、 &&=、 &&=、 &=、 ^=和| =& a+=100; 等价于a=a+100;& a*=b; 等价于a=a*b;&&& 简化程序, 使程序精练;& 提高编译效率, 产生质量较高的目标代码。
运算符与表达式& 2. 3. 4
逗号运算符与逗号表达式& (表达式1) , (表达式2) , (表达式3) , &, (表达式n)& 表达式n的值就是整个逗号表达式的值。【例2-5】 演示逗号表达式。【例2 5】 演示逗号表达式。#include &stdio. h&void main(){printf(&1+2+3+4+5 =%d\n&,(a=1, a=a+2, a=a+3, a=a+4, a=a+5)
) ;printf(&a=%d\n&, a) ;}
数据类型转换& 2. 4. 1
类型转换概述& 不同类型数据的存储长度和存储方式不同, 一般不能直接混合运算。 为了 提高编程效率, 增加应用的灵活性, C语言允许不同数据类型相互转换。不同数据类型的差异& 不同数据类型的差异& double比float高级。& 实数比整数高级。& 整数中长的比短的高级, 如: long&int&short&char& 无符号(unsigned) 比有符号(signed) 高级
数据类型转换& 数据类型转换产生的效果& 数据类型级别的提升与降低& 符号位扩展与零扩展& 截去高位产生数值的变化丢失精度& 丢失精度& 实数转换成整数时, 由于截去小数将丢失精度。& double型转换成float型时, 有效数字减少(四舍五入) , 精度丢失。& long型转换成float型时, 由原来可达10位整数变成只有7位有效数字, 精度丢失, 但由于数的范围扩大了 ,数据类型从较低级提升到较高级
数据类型转换&自动类型转换& float在运算时自动转换成double。& char和short在运算时自动转换成int。& int和unsigned混合运算时, 将int转换成unsigned数据。& int或unsigned与long混合运算时, 都转换成long数据。& int、 unsigned、 long与浮点型数据混合运算时, 都转换成double
自动类型转换规则
数据类型转换&2. 4. 3
赋值类型转换& 赋值运算时, 如果赋值运算符两侧的类型(指基本类型)不一致, 系统自动将表达式的值转换成变量的类型存到变量的存储单元中& 整型数据赋给实型变量时, 数值上不发生任何变化。 如:& f=100;
f 100;& 实型数据赋给整型变量时, 小数部分将被舍弃。 如:& int a = 3. 1415;
/*内存中变量a的值为3*/& 短的有符号整型数据赋给长整型变量时, 需要进行符号位扩展。& 短的无符号的整型数据赋给长整型变量时, 需要进行0扩展。& 则i的值为-1。
数据类型转换& 长整型数据赋给短的整型变量时, 有可能溢出。 如:& char c= 321;
& 溢出后c的值为' A' 。& 同长度有符号整型数据赋给无符号整型变量时, 数据将失去符号位功能如失去符号位功能。 如:& unsignedcharc = -1;& 则c的值为255。& 同长度无符号整型数据赋给有符号整型变量时, 数据将得到符号位功能。 如对于16位int:& int i=65535u;
数据类型转换& 2. 4. 4
强制类型转换& 强制类型转换的格式为:& (类型名) (表达式)& 强制类型转换用于不能自动转换的情况。 例如:& (int)
& (int) (f+0. 5)
法 */& (int) (f*10+0. 5) /10. 0 /*第二位小数的四舍五入算法 */ /*实型数据求余运算*//*第一位小数的四舍五入算
【例2-6】 演示强制类型转换#include &stdio. h&void main(){int i=5;printf(&i=%d, f=%f\n&, i, f) ;i=(int)
f=5/3;printf(&f=%f\n&, f) ;f=(float) 5/3;printf(&f=%d\n&, f) ;
/*实数按整型数方式输出*/printf(&i=%f\n&, i) ;
/*整型按实数方式输出*/}f=3. 1415926;printf(&i=%d\n&, i) ;printf(&f=%f\n&, f) ;
数据的溢出与误差2. 5. 1数据的溢出如图2-18, 将大杯的水倒入小杯, 有两种可能性:①小杯没倒满或刚好满, 水没有溢出②小杯满了, 其余的水溢出char c=127; c = c+1;
【例2-7】 演示数据的溢出#include &stdio. h&void main(){char c=127;i tf(&printf( c=%d,
li=%ld\n ,
c, li) ;c=c+1;li=li+1;li=%ld\n&,
c, li) ;c=127+100;li=+100;c, li) ;uc=127+100; uli=+100;printf(&uc=%d,
uli=%ld\n&,
uc, uli) ;printf(&uc=%u,
uli=%lu\n&,
uc, uli) ;}long li=;li %ld\ &%dli)printf(&c=%d,
printf(&c=%d,
li=%ld\n&,
数据的溢出与误差& 2. 5. 2实型数据的误差& 整数存储除了 溢出以外是没有误差的。& 实型数据由于是用有限的存储单元存储较大范围的实型数, 有效数字是有尾数限制的, 在实际计的实型数, 有效数字是有尾数限制的, 在实际计算和引用中会有很多问题。
【例2-8】 演示实型数据的误差#include &stdio. h&void main(){float
x,x = ;y = x + 0. 12345;printf(&x=%f,
y) ;x = 3. 1415926;y = x - 0. 0001;printf(&x=%. 3f,
y=%. 3f\n&,
y) ;y = x + 0. 0000005;printf(&x=%. 7f,
y=%. 7f\n&,
/*大数加上一个小数, 小数被忽略*//*小数的有效位加1有效*//*小数的无效位加1也无效*/
案例: 一样的'A', 不一样的输出方式#include &stdio. h&#define void main(){char c=' A' ;printf(&%c&, ' A' ) ;printf(&%c& c) ;printf( %c , c) ;printf(&%c&, ' \101' ) ;printf(&%c&, ' \x41' ) ;printf(&%c&, 0101) ;printf(&%c&, 0x41) ;printf(&%c&, 0X41) ;printf(&%c&, 65) ;printf(&%c&, ' a' -32) ;printf(&%c&, CA) ;printf(&\n&) ;}
CA' A'/*定义一个符号常量CA*//*直接输出字符' A' *//*输出变量c*//*输出变量c*//*八进制转义字符形式*//*十六进制转义字符形式*//*八进制整型数0101以字符形式输出*//*十六进制整型数0x41以字符形式输出*//*十六进制整型数0X41以字符形式输出*//*十进制整型数65以字符形式输出*//*小写字母' a' 转换成大写字母后输出*//*宏定义的符号常量CA按字符方式输出*//*输出换行符\n*/
案例: 时间的换算【例2-11】 以秒作为单位输入时间, 计算其相当于多少小时多少分钟多少秒?#include &stdio. h&void main(){long intTotalTint intHour, intMinute, intSprintf(&Please input intTotalTime: &) ;printf( Please input intTotalTime: ) ;scanf(&%d&, &intTotalTime) ;intHour = intTotalTime /3600;intMinute =(intTotalTime - intHour*3600)
/60;intSecond = intTotalTime - intHour*3600 - intMinute*60;printf(&HH: MM: SS = %02d: %02d: %02d\n&, intHour, intMinute, intSecond) ;}
& C语言的数据类型。& C语言的数据类型有4类: 基本类型、 构造类型、 指针类型和空类型。& 基本数据类型包括整型、 实型、 字符型3种。 它们的表示方法、 数据的取值范围等各有特点。& 常量和变量。常量指在程序运行中其值不能被改变的量& 常量指在程序运行中其值不能被改变的量, 包括整数、 长整数、 无符号整数、 浮点数、 字符、 字符串、 符号常量等。 其中特别要注意字符和字符串的区别。& 变量是指在程序运行过程中其值可以被改变的量, 包括各种整型、实型、 字符型等。& 变量的名称可以是任何合法的标识符, 但不能是关键字。 给变量命名时应尽量做到&见名知义& 。包括整数长整数无
& C语言共有13类运算符。& 运算符主要有算术运算符(包括自加、 自减运算符) 、 关系运算符、逻辑运算符、 条件运算符、 位运算符、 赋值运算符和逗号运算符等。& 每种运算符运算对象的个数、 优先级、 结合性也各有不同。 一般而言, 单目运算符优先级较高, 赋值运算符优先级较低。 大多数双目运算符为左结合性, 单目、 三目及赋值运算符为右结合性。运算符为左结合性, 单目、目及赋值运算符为右结合性& 表达式。& 表达式是由运算符连接各种类型的数据(包括常量、 有值变量和函数调用等) 组合而成的式子。 表达式的求值应按照运算符的优先级和结合性所规定的顺序进行。& 数据类型转换。& 不同类型的数据在进行混合运算时, 需要进行类型转换。 类型转换有3种方式:
& 自动类型转换。 当不同类型的数据进行混合运算时, 按照&精度&不降低的原则从低级向高级自动进行转换。& 赋值类型转换。 当赋值运算符两侧的类型不一致时, 将表达式值的类型转换成变量的类型再赋给变量。& 强制类型转换。 当希望将一个表达式强制转换成所需类型时可进行强制类型转换强制类型转换。& 在自动类型转换中, float自动转换成double, char和short自动转换成int进行计算, 而不管是否存在混合类型的运算。 在程序设计中要合理使用数据类型, 避免数值的变化和精度的丢失。
&下面程序的输出是_________。#include &stdio. h&void main(){
printf(&%d, %d, %d, %d\n&,
}下面程序的输出是。下面程序的输出是_________#include &stdio. h&void main(){ int i=1, j,j=i++; printf(&j=%d, i=%d\n&, j, i) ;k=++i; printf(&k=%d, i=%d\n&, k, i) ;j=i--; printf(&j=%d, i=%d\n&, j, i) ;k=- -i;printf(&k=%d, i=%d\n&, k, i) ;i=j=5;printf(&i+j=%d, ++j=%d\n&, i+j, ++j) ;}C语言中的printf用%d输出float类型数据出现或以%f输出int型数据的结果为什么是0
*******************************float类型%d输出**************************************
& & & float
如果用printf("%d",a);输出的是0。&
但float型用%d输出是否一定是0呢,答案肯定不都是0;
& & & 为什么 7.5
用%d输出的是0?分析如下:
首先来了解下printf的输出格式,int 和 long int 都是32位的,用%d输出;float 、double都是%f输出,但
float 是32位的,double 是64位的,所以在参数传递的时候C语言统一将 float 类型数值传换为 double
类型再传入 printf 函数。如果是32位整型则输出格式为%lld。
& & & 下面来讲一下
&float a=7.5
printf("%d",a)输出为0的情况:
%d只输出低32位的数据,并将这些32位二进制以十进制数输出,编译器首先将
7.5从float类型转换为double类型,7.5在内存中的存放方式是0x40f00000,转换成double类型在内存中的数据就是这个0x401e,这个内存数据可以很明显看出低32位全是0,而%d则只能截取到低32位,所以这个以%d输出7.5的数值当然是
0了。如大家不相信可以用%lld
输出看看,这个%lld就很读到低64位数据,读出的结果就是0x401e,在屏幕上看到一个很大的十进制数。
如果我一定要输出7.5在内存中的存放方法怎么办呢?
可以用printf("%d",*(int
*)&a);这里做了一下处理,不是直接把a传进来,把a所在地址里的内容处理了一下,不管a是什么类型,只对地址进行操作,利用(int
*)&a,将a所在地址中的内容0x40f00000直接当成 int 类型传给printf,int
的类型数据不会再转成double类型了,所以输出正常,这个只是针对浮点型数据只占低32位,如果输出64位还得用%lld格式控制输出。
如果用printf("%d",(int)a),输出行不行,这个强制类型转换只针对a的数据类型进行转换,7.5转换 int
类型是7,而上面的*(int
*)&a,是对内存中的实际存储数据进行操作,蔽开数据类型这一层面,只将这个数据0x40f00000直接转成int类型输出。而(int)a,要先看a的类型,C语言会根据所要数据类型,对内存存储的数据进行改变,以便可以用int类型正确解析内存数据。
如果用printf("%d",(float)a),输出什么,输出的是0,这个只是将a的float类型还转成float类型,还是自动转成doube类型,传给printf函数。
为什么float非要转成double类型呢,因为printf格式控制浮点型输出只有%f,所以统一按doube类型输出,不像整型有32位的%d或%ld,64位的有%lld,这就将32位整型和64位整型用不同的格式控制分开了,而%f则没有,所以printf输出的浮点数其实是统一遍历了64位内存,如果float传入printf没有进行转换,那么printf输出高32位数据将不可预知,printf输出结果也就不正确了,因此传入printf的浮点数都会被编译器隐含转成double类型。
***********************int类型%f格式输出************************************
& & & 如果定义了int
a=0x40f00000;用printf("%f",a)输出的结果是多少呢?
答案是0,至少我们看的屏幕上显示的是0.000000,实际值可不是0啊,只是我们显示的精度只能有15位小数,而实际的数据可能很小很小,0.0000....000几百个0后会有几个有效数据,我们分析一下。
首先C语言把a传进printf,因为a是整型,所以不会自动转成double型数据,直接将0x40f00000传进printf,而%f寻的是64位内存,也就是把0xf00000这个内存中的数据当成浮点型输出来,那浮点型的数据是多少呢,又是怎么存储的呢?
64位浮点数的存放方式:
& & & 63位
& & 62~52位 &
& & & 1个符号位
&11个阶数 & &
从0xf00000来看
1)符号位是0,表示正
& & 2)阶数是0,表示-1023 + 1023 =
0,用指数表示:1.#*2^-1023,‘#’是代表尾数。
3)尾数就是,0x00
4)浮点二进制表示
&2#1.0000*2^(-1023),-1023次方可想而知有多小。
这就是为什么我们的int型数据用%f输出是0.000000的原因。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 c语言double和float 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信