1.数据类型
(1)常量与变量
(2)c语言一共有32个关键字
(3)变量定义:数据类型 变量名(标识符)
变量赋值:变量名=值
(4)标识符命令规则:
1)不能是关键字
2)标识符只能由字母、数字、下划线组成
3)见名知义
4)第一个字符必须为字母或下划线
5)不能和同一函数内的其他标识符重复
6)标识符区分大小写
(5)常量定义:
1)const 数据类型 常量名
2)#define【宏定义】 常量名 数值
(6)常量
在程序运行过程中,其值不能被改变的量
常量一般出现在表达式或赋值语句中
①注意;通过#define 定义的常量是根据值来匹配数据类型的
② const 修饰的常量是不安全的,可以通过指针来修改
2.进制
(1)二进制:逢二进一
二进制转化为十进制:
权值法:二进制各个位数乘以2的n次幂,结果相加
(2)十进制转化为二进制:除二取余法
(3)八进制和二进制转化:
(4) 十进制转化为八进制:除八取余法
(5)八进制转化为十进制:权值法
(6)八进制和二进制转化:一位对三位
(7)十进制转化为十六进制:除十六取余法
(8)十六进制转化为十进制:权值法
(9)十六进制和二进制转化:一位对三位
A-F字符不分大小写
3.进制在程序中打印:
int a=10;//十进制中的10
int b=010;//八进制中的10 在定义一个八进制数需要在数前面加上0区分
int c=0x10;//十六进制中的10 在程序中定义一个十六进制数需要在数前面加上0x区分
int d=0X10;//十六进制中的10 在程序中定义一个十六进制数需要在数前面加上0X区分
%d 将数据按照十进制输出
%o 将数据按照八进制输出
%x 将数据按照十六进制小写输出
%X 将数据按照十六进制大写输出
二、计算机内存数据存储方式
一个有符号的数据可以分为符号位和数据位
3、原码、反码、补码
一个有符号的整型数据可以分为两部分一部分是符号位、一部分是数字位
无符号数据类型只包含数字位部分
signed int a= 1986(有符号标识 signed可以不用写)
二进制:11111000010
1986原码:0000 0000 0000 0000 0000 0111 1100 0010
-1986原码:1000 0000 0000 0000 0000 0111 1100 0010
1986反码: 0000 0000 0000 0000 0000 0111 1100 0010
-1986反码:1111 1111 1111 1111 1111 1000 0011 1101
1986补码: 0000 0000 0000 0000 0000 0111 1100 0010
-1986反码:1111 1111 1111 1111 1111 1000 0011 1110
1 0000 0000 0000 0000 0000 0000 0000 0000
溢出:在数据进行操作的时候会导致超出数据类型大小,会向前位进1,多于原始数据类型大小,会被系统自动舍弃 保留从后面开始数据类型大小的位数
10+20
0000 1010
0001 0100
0001 1110
-10+-20
原码:1000 1010
反码:1111 0101
补码:1111 0110
原码:1001 0100
反码:1110 1011
补码:1110 1100
1111 0110
1110 1100
补码:1110 0010
反码:1110 0001
原码:1001 1110 16+8+4+2=-30
练习:用生辰年份年去生辰日期
1992
-326
1、将10进制转化为二进制
1992 :0000 0000 0000 0000 0000 0111 1100 1000
-326 :0000 0000 0000 0000 0000 0001 0100 0110
2、加符号位将数据变为原码
1992 :0000 0000 0000 0000 0000 0111 1100 1000
-326 :1000 0000 0000 0000 0000 0001 0100 0110
3、转化为反码
1992 :0000 0000 0000 0000 0000 0111 1100 1000
-326 :1111 1111 1111 1111 1111 1110 1011 1001
4、将反码+1转化为补码
1992 :0000 0000 0000 0000 0000 0111 1100 1000
-326 :1111 1111 1111 1111 1111 1110 1011 1010
5、计算补码
1992 :0000 0000 0000 0000 0000 0111 1100 1000
-326 :1111 1111 1111 1111 1111 1110 1011 1010
结果 : 1 0000 0000 0000 0000 0000 0110 1000 0010
6、将数据转化为10进制
110 1000 0010
2+128+512+1024 = 1666
无符号:
unsigned int a= 1986
无符号:1111 1111 1111 1111 1111 1111 1111 1111 =
0000 0000 0000 0000 0000 0000 0000 0000 =0
无符号整型取值:0-4294967295(2^32-1)
无符号的字符型:0-255
有符号:
int a= 1986
0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647
0000 0000 0000 0000 0000 0000 0000 0001
原码: 1111 1111 1111 1111 1111 1111 1111 1111 = -2147483647
反码:1000 0000 0000 0000 0000 0000 0000 0000
补码:1000 0000 0000 0000 0000 0000 0000 0001=-2147483647
-0的补码
补码:1000 0000 0000 0000 0000 0000 0000 0000=-0 = -2147483648
4、sizeof()
l sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节
求出数据类型在内存中占的大小(BYTE)
int value =sizeof(变量名);
int value = sizeof(数据类型) sizeof 数据类型
注意:根据32位操作系统获取的数据类型大小
char(字符型)【1】<short(短整型)【2】
<=int(整型)【4】|float (单精度浮点型)【4】|long(长整型)【4】
<long long(长长整型)【8】|double(双精度浮点型)【8】
整型常量
|
所需类型
|
10
|
代表int类型
|
10l, 10L
|
代表long类型
|
10ll, 10LL
|
代表long long类型
|
10u, 10U
|
代表unsigned int类型
|
10ul, 10UL
|
代表unsigned long类型
|
10ull, 10ULL
|
代表unsigned long long类型
|
打印格式
|
含义
|
%hd
|
输出short类型
|
%d
|
输出int类型
|
%l
|
输出long类型
|
%ll
|
输出long long类型
|
%hu
|
输出unsigned short类型
|
%u
|
输出unsigned int类型
|
%lu
|
输出unsigned long类型
|
%llu
|
输出unsigned long long类型
|
有符号和无符号整型取值范围
数据类型
|
占用空间
|
取值范围
|
short
|
2字节
|
-32768 到 32767 (-215 ~ 215-1)
|
int
|
4字节
|
-2147483648 到 2147483647 (-231 ~ 231-1)
|
long
|
4字节
|
-2147483648 到 2147483647 (-231 ~ 231-1)
|
unsigned short
|
2字节
|
0 到 65535 (0 ~ 216-1)
|
unsigned int
|
4字节
|
0 到 4294967295 (0 ~ 232-1)
|
unsigned long
|
4字节
|
0 到 4294967295 (0 ~ 232-1)
|
转义字符:
输出和输入:
输出字符的两种方式:
1、printf("%c",变量)
2、putchar(字符)
printf是输出一个字符串,putchar输出一个char。
输入字符的两种方式:
1、scanf("%c",&b变量)
2、变量=getchar()
l getchar是从标准输入设备读取一个char。
l scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据。
数值溢出:
当超过一个数据类型能够存放最大的范围时,数值会溢出。
有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。
char 1B=8bit
0x7f
0111 1111
0000 0010
1000 0001
1000 0000
1111 1111 -127
0xff
1111 1111
0000 0001
1 0000 0000
数据类型
|
占用空间
|
有效数字范围
|
float
|
4字节
|
7位有效数字
|
double
|
8字节
|
15~16位有效数字
|
限定符
|
含义
|
extern
|
声明一个变量,extern声明的变量没有建立存储空间。
extern int a;
|
const
|
定义一个常量,常量的值不能修改。
const int a = 10;
|
volatile
|
防止编译器优化代码
|
打印格式
|
对应数据类型
|
含义
|
%d
|
int
|
接受整数值并将它表示为有符号的十进制整数
|
%hd
|
short int
|
短整数
|
%hu
|
unsigned short
|
无符号短整数
|
%o
|
unsigned int
|
无符号8进制整数
|
%u
|
unsigned int
|
无符号10进制整数
|
%x,%X
|
unsigned int
|
无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF
|
%f
|
float
|
单精度浮点数
|
%lf
|
double
|
双精度浮点数
|
%e,%E
|
double
|
科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写
|
%c
|
char
|
字符型。可以把输入的数字按照ASCII码相应转换为对应的字符
|
%s
|
char *
|
字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0‘结尾,这个'\0'即空字符)
|
%p
|
void *
|
以16进制形式输出指针
|
%%
|
%
|
输出一个百分号
|
printf附加格式:
字符
|
含义
|
l(字母l)
|
附加在d,u,x,o前面,表示长整数
|
-
|
左对齐
|
m(代表一个整数)
|
数据最小宽度
|
0(数字0)
|
将输出的前面补上0直到占满指定列宽为止不可以搭配使用-
|
m.n(代表一个整数)
|
m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。
|
思考任务(课后练习)
-
八进制必须以__0___开头,十六进制必须以___0x____开头。
-
标识符只能由___数字____、__字母_____和__下划线_____组成。
-
在计算机中的进制表现形式有三种,分别是__十进制___、 __八进制_____、 _十六进制_______。
-
C 语言提供了 sizeof 运算符,该运算符主要用于__计算数据类型字节数______。
-
二进制和八进制相互转换
111 010 101 011 转换为八进制后结果为?
7253
76321 转换为二进制结果为?
00010010101000100001
-
二进制和十六进制相互转换
1111 1010 1101 1011 转换为十六进制后结果为?
fadb
a6b2f1 转换为二进制结果为?
1010 0110 1011 0010 1111 0001
-
请写出-8的原码、反码、补码
原码:1000 0000 0000 1000
反码:1000 0000 0000 1001
补码:1111 1111 1111 0110
-
计算如下程序结果
printf("%d\n", a); //结果为多少?
unsigned short a = 0xfffe;
printf("%u\n", a); //结果为多少?
printf("%d\n", a); //结果为多少?
unsigned short a = 0xffff + 5;
printf("%u\n", a); //结果为多少?