03-变量\常量\进制
变量和数据类型
所有定义的变量都存在内存中,定义变量需要内存空间,不同类型的变量需要的内存空间是不同的
数据类型作用:告诉编译器,我这个数据在内存中需要多大的空间,编译器预算对象(变量)分配的内存空间大小。
1.常量与变量
1.1 常量
常量:程序运行中不能改变的量
- 整型常量:1 200
- 字符常量: 'c'
- 字符串常量:"hello"
- 实型常量(浮点型常量):3.14,0.125
整型常量 | 100,200,-100,0 |
---|---|
实型常量 | 3.14 , 0.125,-3.123 |
字符型常量 | ‘a’,‘b’,‘1’,‘\n’ |
字符串常量 | “a”,“ab”,“12356” |
1.2 变量
1. 变量的空间大小
变量:程序运行中可以被改变的量,存在于内存中
- 变量需要定义,变量的定义:在内存中开辟空间,告诉编译器我有这个变量(声明),变量定义的本质:在内存中开辟空间,给这个空间取名**
- 数据类型 变量名(数据类型告诉编译器占多大的空间)
- int类型在内存中占4字节
- short类型在内存中占2字节
- long类型,在windows中都是4字节,linux中,32位系统4字节,64位系统8字节
- char类型在内存中占1个字节
- float类型在内存中占4字节,用于存储小数(float精度能达到7位小数)
- double类型在内存中占8字节(double精度能达到15位小数)
char short int long都可以用来存储整数
int a; // 在内存中定义了一个变量a,占int类型大小4个字节
char b; // 在内存中定义了一个变量b,占一个字节
2. 变量的命名规则
- 定义变量时,变量名必须以字符和下划线开头,不能以数字开头
- 变量取名不能为关键字
- 变量取名的时候要顾名思义
- 变量定义时要区分大小写
变量定义的本质:在内存中开辟空间,给这个空间取名 - extern 数据类型 变量名--告诉编译器有这个变量,但是这里不开辟空间
int num;
num = 100;
//int num = 200; 定义变量并且初始化
printf("num = %d\n", num);
return 0;//成功完成
extern short SUM; // extern 告诉编译器我有这个变量,没有定义,不能进行赋值
// 声明有SUM,并没有开辟空间,只有在定义的时候开辟空间
// 定义可以在其他.c文件中定义变量或者main函数外的位置等
#define MAX 10 // MAX相当于一个常量
MAX = 100; // 报错,MAX是一个常量,常量不可以被更改
3. 变量的特点
- 变量在编译时为其分配相应的内存空间
- 可以通过其名字和地址访问相应的内存
4. 声明和定义的区别
- 声明变量不需要建立存储空间,如:extern int a;
- 定义变量需要建立存储空间,如:int b;
#include <stdio.h>
int main()
{
//extern 关键字只做声明,不能做任何定义,后面还会学习,这里先了解
//声明一个变量a,a在这里没有建立存储空间
extern int a;
a = 10; //err, 没有空间,就不可以赋值
int b = 10; //定义一个变量b,b的类型为int,b赋值为10
return 0;
}
从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义:
- int b 它既是声明,同时又是定义
- 对于 extern b来讲它只是声明不是定义
一般的情况下,把建立存储空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。
#include <stdio.h>
#define MAX 10 //声明了一个常量,名字叫MAX,值是10,常量的值一旦初始化不可改
int main()
{
int a; //定义了一个变量,其类型为int,名字叫a
const int b = 10; //定义一个const常量,名为叫b,值为10
//b = 11; //err,常量的值不能改变
//MAX = 100; //err,常量的值不能改变
a = MAX;//将abc的值设置为MAX的值
a = 123;
printf("%d\n", a); //打印变量a的值
return 0;
}
1.3 关键字
1.4 const修饰的变量
const关键字修饰的变量不能被更改
#include <stdio.h>
int main()
{
int a; //定义了一个变量,其类型为int,名字叫a
const int b = 10; //定义一个const常量,名为叫b,值为10
//b = 11; //err,常量的值不能改变
return 0;
}
const修饰的变量b,告诉编译器,不能通过b(变量名)修改这块空间的内容,但是可以通过地址进行修改
2.进制
进制也就是进位制,是人们规定的一种进位方法。 对于任何一种进制—X进制,就表示某一位置上的数运算时是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
2.1 二进制
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。
当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。
- C语言中是没有办法书写二进制的
1 术语
术语 | 含义 |
---|---|
bit(比特) | 一个二进制代表一位,一个位只能表示0或1两种状态。数据传输是习惯以“位”(bit)为单位。 |
Byte(字节) | 一个字节为8个二进制,称为8位,计算机中存储的最小单位是字节。数据存储是习惯以“字节”(Byte)为单位。 |
WORD(双字节) | 2个字节,16位 |
DWORD | 两个WORD,4个字节,32位 |
1b | 1bit,1位 |
1B | 1Byte,1字节,8位 |
1k,1K | 1024 |
1M(1兆) | 1024k, 1024*1024 |
1G | 1024M |
1T | 1024G |
1Kb(千位) | 1024bit,1024位 |
1KB(千字节) | 1024Byte,1024字节 |
1Mb(兆位) | 1024Kb = 1024 * 1024bit |
1MB(兆字节) | 1024KB = 1024 * 1024Byte |
2. 十进制转换二进制
十进制转化二进制的方法:用十进制数除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。
十进制的小数转换成二进制:小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果。
2.2 八进制
八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。一些编程语言中常常以数字0开始表明该数字是八进制。
八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。
十进制转化八进制的方法:
用十进制数除以8,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。
0123 // 八进制,八进制数之前加0
2.3 十六进制
十六进制(英文名称:Hexadecimal),同我们日常生活中的表示法不一样,它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9,A-F对应10-15。
十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位),因此常应用在计算机语言中。
十进制转化十六进制的方法:
用十进制数除以16,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。
2.4 C语言各个进制数的表示
十进制 | 以正常数字1-9开头,如123 |
---|---|
八进制 | 以数字0开头,如0123 |
十六进制 | 以0x开头,如0x123 |
二进制 | C语言不能直接书写二进制数 |
#include <stdio.h>
int main()
{
int a = 123; //十进制方式赋值
int b = 0123; //八进制方式赋值, 以数字0开头
int c = 0xABC; //十六进制方式赋值
//如果在printf中输出一个十进制数那么用%d,八进制用%o,十六进制是%x
printf("十进制:%d\n",a );
printf("八进制:%o\n", b); //%o,为字母o,不是数字
printf("十六进制:%x\n", c);
return 0;
}
#include <stdio.h>
int main()
{
int a = 123; //十进制方式赋值
int b = 0123; //八进制方式赋值, 以数字0开头
int c = 0xABC; //十六进制方式赋值
//如果在printf中输出一个十进制数那么用%d,八进制用%o,十六进制是%x
printf("十进制:%d\n",a );
printf("八进制:%o\n", b); //%o,为字母o,不是数字
printf("十六进制:%x\n", c);
printf("a-%#X\n",c); // #表示输出0x,X表示输出大写字母
system("pause");
return 0;
}
数值在计算机中的存储内容没有发生变化,打印时只是输出的形式发生变化