您的位置:首页 > 其它

常量与变量以及在内存中存储形式

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就是整型,而整型与浮点型存储格式不同。

常量:值不会发生改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: