1.常量和变量
1.1关键字
C的关键字共有32个
·数据类型关键字(12个)
char, short, int, long, float, double,unsigned, signed, struct,union, enum, void
·控制语句关键字(12个)
if,else, switch, case, defaultfor, do, while, break, continue, goto, return
·存储类关键字(5个)
auto, extern,register,static,const
·其他关键字(3个)
sizeof, typedef, volatile
1.2 数据类型
数据类型的作用:告诉编译器定义这么一个类型的变量需要分配多少空间
1.3 常量
int main(int argc,char *argv[])
{
//1、常量:程序运行期间,不允许修改
//10=1;//err此处会运行错误,10不可能等于1,而这里有没有整型,没有对它进行赋值,则会出现错误
}
1.4变量
1)变量
//变量
{
//1.程序运行期间,允许修改
//2.变量名字遵循命名规范(有数字、字母、下划线组成,首字母不能是数字)
//3.定义变量时,必须有相应的类型
//4.同一个{}内部,不能出现2个同名变量的定义
//定义一个变量,变量名字叫a,它的类型为int整型
int a;
a =10;
return 0;
}
2)声明和定义区别
使用示例:
//extern是一个关键字,声明一个变量,声明变量没有建立存储空间(暂时了解,后面再学习)
extern int d;
d=1;//err,d还没有定义,没有定义就没有空间,没有空间就不能赋值
return 0;
int b 它既是声明,同时也是定义
extern b 它只是声明不是定义
3)常用代码和变量示例代码
//#include <stdio.h>
//1、#开头的语句是预处理语句,无需分号结束
//2、定义一个宏定义的标示符MAX,它代表100,MAX它是常量
//3、宏定义以后的代码都可以使用MAX
//4、在后面出现的MAX,预处理都会替换为100
#define MAX 100
int main(int argc,char *argv[])
{
//10 = 1;
//MAX=1://MAX它是常量,不允许修改
MAX;
MAX;
int b= MAX;
//const是一个关键字,作用是修饰一个变量为只读
const int c=10;
c=100;//err,c只读,不允许修改
int e=c;//把c的值给e,c本身没有变量
int d;
d=100;//ok,变量可以修改
return 0;
}
2.进制
左边是高位,右边是低位
当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。
注释:b(小写)是在二进制中以1和0为单位
B(大写)是以8进制为单位,相当于3个2,也就是b的8倍
1k,1K是1024为单位
1kb,1KB也是1024
2.1 二进制
3 | 2 | 1 | 0 | 逢2进1 | ||||||||
1 | 0 | 1 | 1 | |||||||||
1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | |||||
2^3 | 0 | 2^1 | 0 | = | 10 | 1 | 1 | 0 | 1 | 0 | ||
0 | 1 | 1 | 0 | |||||||||
0 | 2^2 | 2^1 | 0 | = | 6 | |||||||
1 | 1 | 1 | 1 | |||||||||
2^3 | 2^2 | 2^1 | 2^0 | = | 15 | |||||||
8 | 4 | 2 | 1 | |||||||||
2.2 八进制
3 | 2 | 1 | 0 | 逢8进1 | ||||||||
7 | 0 | 1 | 1 | |||||||||
1 | 0 | 0 | 1 | 1 | 2 | 1 | 5 | |||||
8^3 | 0 | 0 | 8^0 | = | 513 | 1 | 0 | 2 | 2 | 6 | ||
0 | 2 | 4 | 0 | |||||||||
0 | 2*8^2 | 4*8^1 | 0 | = | 160 |
2.3 十六进制
3 | 2 | 1 | 0 | 逢16进1 | f为15 | |||||||
f | 9 | 9 | 1 | |||||||||
1 | 0 | 0 | 1 | 1 | 2 | 9 | c | c为12 | ||||
16^3 | 0 | 0 | 16^0 | = | 4097 | 1 | 0 | c | 2 | d | ||
12 | 13 | |||||||||||
0 | 2 | 4 | 0 | |||||||||
0 | 2*16^2 | 4*16^1 | 0 | = | 576 |
10~15 16为10
A~F
2.4十进制转2/8/16进制
注释:10位数除以2/8/16,除到整数为零,除不尽时为1,除比它小的数时为零,余数放旁边最后将余数倒过来看就是结果
2 | 56 | 余数 | ||||||||||
2 | 28 | 0 | ||||||||||
2 | 14 | 0 | ||||||||||
2 | 7 | 0 | ||||||||||
2 | 3 | 1 | ||||||||||
2 | 1 | 1 | ||||||||||
0 | 1 |
2.5 十进制的小数转换成二/八/十六进制:小数部分和2/8/16相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果
2.6八进制和十六进制相互转换(先借助2进制再转)
2.4C语言如何表示相应进制数
十进制 以正常数字 1-9开头,如 123
八进制 以数字0开头,如 0123
十六进制 以 0x开头,如 0x123
二进制 C语言不能直接书写二进制数
#include <stdio.h> h>
int main()
{
int a= 123; //十进制方式赋值
int b=0123; //八进制方式赋值,以数字0开头
int c=0x123; //十六进制方式赋值
//如果在 primntf中输出一个十进制数那么用%d,八进制用%o,十六进制是%x
printf("十进制:%d\n",a);
printf("八进制:%o\n",b);//%o,为字母。,不是数字
printf("十六进制:%x\n",c);
retun 0;
}
2.3 计算机内存数值存储方式
1)存储1字节(8位)大小的数字(char)
2.3.1 原码
原码(用户角度):原始的二级制
1.用户的数字分为正负数,符号位的存储
2.最高位为符号位:0代表为正数,1代表为负数
3.1000 00001左边是高位,右边是低位
+1:0000 0001
-1:1000 0001
+0:0000 0000
-0:1000 0000
原码存储导致2个问题:
1.0有两种存储方式
2.正数和负数相加,结果不正确(计算机只会加不会减)
1-1=1 + -1
1:0000 0001
-1:1000 0001
1000 0010= -2
2.3.2 反码
反码(为了算补码):
1.求原码
2.在原码基础上,符号位不变,其它位取反 (0为1,1变0)
3.正数的原码和反码是一样的
+1:000 0001
-1:1111 1110
+0:000 0000
-0: 1111 1111
反码储存导致1个问题:
0有两种储存方式(相当于把1+-1变为了0的存储方式)
以反码来算:
1-1=1+-1
1: 0000 0001
-1: 1111 1110
1111 1111 =-0
2.3.3 补码
计算机存储数字以补码方式存储(为了解决负数的存储)
1、正数的原码、反码、补码都一样
2、补码为其反码+1
1,+1:0000 0001
-1:1111 1111
+0:0000 0000
-0:10000 0000(最高位丢弃)= 0000 0000
以补码来算:
1-1=1 + -1
1:0000 0001
-1: 1111 11111
10000 0000(最高位丢弃)= 0000 0000
2.3.4 补码的意义
10进制数,站在用户的角度,原码
二进制、八进制、十六进制,站在计算机角度,补码
原码求补码:
1) 最高位符号位,其它位就是二进制(原码
)2 在1)基础上,符号位不变,其它位取反
3) 补码在2)基础上加1
补码求原码:
//二进制、八进制、十六进制,站在计算机角度,补码
//0x81转化为二进制位1000 0001,最高位为1,说明是负数
char a=0x81;
补码:1000 0001
反码:1111 1110
原码:1111 1111=-127
//10进制数,站在用户的角度,原码
printf("号d\n",a); //-127
0x6f的二级制为0110 1111,最高位为0,它是正数
char c=0x6f;
printf("%d\n",c);
//10进制数,站在用户的角度,原码
int a=-123;
原码:1000 0000 0000 0000 0000 0000 0111 1011
反码:1111 1111 1111 1111 1111 1111 1000 0100
补码:1111 1111 1111 1111 1111 1111 1000 0101
f f f f f f 8 5
%x默认以4个字节(32位)大小打印号
//二进制、八进制、十六进制,站在计算机角度,补码
printf("号x\n",a);
1有符号和无符号的区别:
1)有符号,最高位是符号位,如果是1代表为负数,如果为0代表为正数
2)无符号,最高位不是符号位,是数的一部分,无符号不可能是负数
int main(int argc,char *argv[])
{
printf("%d\n",0x8000007b);
printf("%u\n"0x8000007b);
//等价于int =-10;
siqned int a=-10;
unsigned int c=10;
unsiqned int c=0x8000007b;//无符号不可能是负数
printf("c = "%d\n', c);//输出结果以号d为准,&d默认以有符号方式输出
printf("c = "%u\n', c);
return 0;
}
数据类型范围(站在10进制角度,原码)
char 1个个字节
有符号的范围:
正数:
0000 0000 ~ 0111 111
0 127
负数:
1000 0000 ~ 1111 111
-0 ~ -127
-0当做 -128使用
-128:
原码:1 1000 0000
反码:1 0111 1111
补码:1 1000 0000
(最后补码和原码的值是一样的,所以-0可以看作-128)
无符号范围:
0000 0000~1111 1111
0~ 255
char :
有符号:-128~127
无符号:0~255
赋值或者运算,记得不要越界
char a = 127=+2
129转换为二进制1000 0001,这是负数补码
补码:1000 0001
反码:1111 1110
原码:1111 1111(最高位是符号位) -127
printf("%d\n",a);
unsigned char b=255+2;
257转化为二进制0001 0000 0001(只取后8位)
printf("%u\n",b);