C语言变量
C语言变量,是指内存空间中的一段内存区域,可以用于存放和读取一定大小的数据。每个变量都在内存中有一个独立的地址,在变量有效期内变量的地址一直保持不变。
变量命名规则
编译器对变量的命名是有一定要求的,如果不符合变量命名规则会编译时就会出错。
a)变量名只能是字母(a-z A-Z),数字(0-9)与下划线(_)的组合,并且之间不能包含空格;
b)变量名首字母必须为字母(a-z A-Z)或者下划线(_),数字不能放在变量名首位;
c)变量名不能使用关键字做变量名,比如:for、while、case、break等关键字等。
将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
a)添加一些新的变量名,违反以上三种变量命名规则时查看是否编译出错;
b)在运行结果中,查看a1与_f1两个变量地址相差的距离。
另外,除了编译器对变量的命名有要求外,各个软件开发公司往往还有额外的代码规范。网上流传最多的就是匈牙利命名法,该命名法是在每个变量名的前面加上若干表示数据类型的字符。基本原则是:变量名=属性+类型+对象描述。
例如:int m_nAge;
m_代表成员变量,g_代表全局变量。n代表该变量是一个整型变量,Age代表这个变量是用来记录年龄的。更详细的匈牙利命名法或者公司代码规范,可以通过网上搜索,这里只做简单介绍。
变量分类:
根据当个变量的空间长短可分为:
a)字符型变量(1个字节):char类型、unsigned char类型;
b)短型变量(2个字节):short类型、unsigned short类型;
c)长型变量(4个字节):int、unsigned int(或long、unsigned long)或float类型以及指针变量等;
d)超长型变量( 8个字节):double类型、__int64或long long等。(有些编译器不支持__int64类型,有些编译器不支持long long)
根据类型可以分为:
a)整数型变量:包括char、 unsigned char、short、 unsigned short、int、 unsigned int(或long、unsigned long )以及 __int64或long long等。
b)浮点数型变量:float类型(单精度)、double类型(双精度);
c)其他变量类型:数组变量、指针变量以及结构体对象等。
变量的存储原理
4个位的二进制数,刚好表达的是十六进制数字的个位数。如果再加4个位就是8位,刚好表达的就是十六进制的两位数。计算机以8个位代表一个字节,表达的数字是0x00到0xFF之间的数字,也就是从0到255之间总共256个数字,就像十进制中的两位数是0到99总共100个那样。
单字节(8位)变量
单字节变量也叫8位变量,包括unsigned char和char两种类型,都属于整型变量。
unsigned char:无符号单字节变量,存储范围是0-255(0xFF)。
char:有符号单字节变量,存储范围是-128到0到127之间的数。
单字节变量的存储原理
对于unsigned char类型变量,毫无疑问只要在8个位不同的位置上存储1或0,就能得到0-255之间256种组合后的数字。
为了让char类型存储的256种数字中,一半是正数一半是负数,计算机将char类型变量中的最高位作为符号位。最高位为0的是正数,最高位为1是负数。最高位是0时最大的数字就是0x7F,转成二进制就是0111 1111。对这个二进制或者十六进制数加1,就会出现最高位为1的数字,即:0x80(1000 0000)。
很明显,十六进制0x80作为中间点,左右各有一半的十六进制数字,就如十进制中50是0到100之间的中间值。0x80对应的十进制是128, 0到127之间都是正数区域,从128开始对于char类型变量则开始变成负数了。
那么如何将负数区域的十六进制或二进制数字,转换为一个对应十进制的负数呢?先编写点代码来测试一下。
测试8位变量的存储特点 #include <stdio.h> int main() { char c = 129; //有符号(有负号): 0-127 -1 到 -128 unsigned char u = 255; //无符号:0-255 printf("u=%d\t c=%d\n",u,c); u = 0x8887F; //溢出 之后只留1个字节 c = 0x88877F; //溢出 printf("u=%d\t c=%d\n",u,c); u = 256; //0x100 //溢出 c = 256; printf("u=%d\t c=%d\n" |