变量:其值在其作用域内可以改变的量叫做变量。变量在其使用前必须定义,每一个变量都有自己的地址。
变量可以分为整型、浮点型(实数)、字符型、指针型。
每一个变量被定义好了,系统就会分配字节给其来存放值。
整型变量: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就是整型,而整型与浮点型存储格式不同。
常量:值不会发生改变。