常量与变量以及在内存中存储形式
2016-07-16 11:03
232 查看
变量:其值在其作用域内可以改变的量叫做变量。变量在其使用前必须定义,每一个变量都有自己的地址。
变量可以分为整型、浮点型(实数)、字符型、指针型。
每一个变量被定义好了,系统就会分配字节给其来存放值。
整型变量:4个字节(长整型4、短整型2,(无符号型与有符号的字节数一样,只是有符号的最高位为符号位))。
浮点型变量:float4个字节,double8个字节。
字符型变量:1个字节。
指针型变量:4个字节,由于指针里存放的地址,而32机里地址是32位,所以是4个字节。
整型变量在内存里是以二进制补码的形式存放的。例如:-18 二进制是 1000 0000 0000 0000 0000 0000 0001 0010(原码)1111 1111 1111 1111 1111 1111 1110 1101(反码)1111 1111 1111 1111 1111 1111 1110 1110(反码)(负数的补码为原码去反加一,最高位保持不变为符号位,正数的原、反、补一样。符号位0为正,1为负)。
字符型变量在内存里也是以补码形式存放的,是以ASCLL码的补码形式存放的。例如:char t;t = 98;printf("%c",t);输出为小写的b。在计算机中是以98的补码存放的的。
C语言允许对整形变量赋以字符值,也允许对字符变量赋以整形值。在输出时,允许把字符变量按整形输出,也允许把整形量按字符量输出。
浮点型变量的存储:浮点表示法类似于科学计数法,任一数均可通过改变指数部分,使小数点位置发生移动,如23.45可以写成:2.345*10^1
浮点表示的一般形式为:R=M*2^e (R:Real M:Mantissa尾数 e:exponent阶码)
把上面float的二进制可分成三部分:
x xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx
数符(1b) 阶码(8b) 尾数(23b)
double型的浮点数分别是:数符(1b)、阶码(8b)、尾数(52b)
数符sign:real的正负号 "+":0 "-":1。阶码e:这里二进制其实是移码E(0~255)的表示,e=E-127(double型中e=E-1023) e为正值说明这个浮点数向左移动了e位,e为负值说明这个浮点数向右移动了e位。127=2^7-1 1023=2^10-1
尾数M:有效数字位,这里是有效数字位的部分二进制码.
正因为整型与浮点型存储方法不同,所以转换不能随意。
例如:
上面这个程序输出为:-1610612736。
要想正确输出加上: int b;b=(int) a;printf("%d",b);输出为34.
所以要想类型变换输出要加强制转换:(类型名) 变量。
float与double转换也要注意,一个是4个字节,一个是8个字节,printf从高子节输出,而scanf从低字节输入。
例如:
若给a赋值12.54,输出确实0.000000.
double里8个字节,scanf(%f),%f为float型4个字节,从低位输入,高四位没有值为0,所以printf为0.000000
所以程序中变量应该与格式符对应。
注意:
float a;
a = 3;和
scanf("%d",&a);然后把3给a是不一样的。a=3中3是浮点型只是形式是3而scanf中输入3就是整型,而整型与浮点型存储格式不同。
常量:值不会发生改变。
变量可以分为整型、浮点型(实数)、字符型、指针型。
每一个变量被定义好了,系统就会分配字节给其来存放值。
整型变量:4个字节(长整型4、短整型2,(无符号型与有符号的字节数一样,只是有符号的最高位为符号位))。
浮点型变量:float4个字节,double8个字节。
字符型变量:1个字节。
指针型变量:4个字节,由于指针里存放的地址,而32机里地址是32位,所以是4个字节。
整型变量在内存里是以二进制补码的形式存放的。例如:-18 二进制是 1000 0000 0000 0000 0000 0000 0001 0010(原码)1111 1111 1111 1111 1111 1111 1110 1101(反码)1111 1111 1111 1111 1111 1111 1110 1110(反码)(负数的补码为原码去反加一,最高位保持不变为符号位,正数的原、反、补一样。符号位0为正,1为负)。
字符型变量在内存里也是以补码形式存放的,是以ASCLL码的补码形式存放的。例如:char t;t = 98;printf("%c",t);输出为小写的b。在计算机中是以98的补码存放的的。
C语言允许对整形变量赋以字符值,也允许对字符变量赋以整形值。在输出时,允许把字符变量按整形输出,也允许把整形量按字符量输出。
浮点型变量的存储:浮点表示法类似于科学计数法,任一数均可通过改变指数部分,使小数点位置发生移动,如23.45可以写成:2.345*10^1
浮点表示的一般形式为:R=M*2^e (R:Real M:Mantissa尾数 e:exponent阶码)
把上面float的二进制可分成三部分:
x xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx
数符(1b) 阶码(8b) 尾数(23b)
double型的浮点数分别是:数符(1b)、阶码(8b)、尾数(52b)
数符sign:real的正负号 "+":0 "-":1。阶码e:这里二进制其实是移码E(0~255)的表示,e=E-127(double型中e=E-1023) e为正值说明这个浮点数向左移动了e位,e为负值说明这个浮点数向右移动了e位。127=2^7-1 1023=2^10-1
尾数M:有效数字位,这里是有效数字位的部分二进制码.
正因为整型与浮点型存储方法不同,所以转换不能随意。
例如:
上面这个程序输出为:-1610612736。
要想正确输出加上: int b;b=(int) a;printf("%d",b);输出为34.
所以要想类型变换输出要加强制转换:(类型名) 变量。
float与double转换也要注意,一个是4个字节,一个是8个字节,printf从高子节输出,而scanf从低字节输入。
例如:
若给a赋值12.54,输出确实0.000000.
double里8个字节,scanf(%f),%f为float型4个字节,从低位输入,高四位没有值为0,所以printf为0.000000
所以程序中变量应该与格式符对应。
注意:
float a;
a = 3;和
scanf("%d",&a);然后把3给a是不一样的。a=3中3是浮点型只是形式是3而scanf中输入3就是整型,而整型与浮点型存储格式不同。
常量:值不会发生改变。
相关文章推荐
- Web基础之httpd服务搭建(一)
- 翻页功能测用例设计
- 做10年Windows程序员与做10年Linux程序员的区别
- hdu 1667 The Rotation Game(2004 Asia Regional Shanghai)
- Summer day 5
- POJ_2488: A Knight's Journey
- c#之回车登录
- 给CentOS6.3 + PHP5.3 安装PHP性能测试工具 XHProf-0.9.2
- [SLAM]2D激光线特征提取
- 用LVS配置一个简单的web LB集群
- 在敏捷测试中如何设计用例
- Barnicle
- MySQL索引,MySQL中索引的限制?
- 初学const总结
- c++遇到问题
- LocalStorage缓存
- 深入Python(4):深拷贝和浅拷贝
- 为什么我们都不写博客了?
- MySQL索引,如何正确创建MySQL索引?
- 关于Python的若干常用片段