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)

 转义字符:

\t

水平制表(HT) (跳到下一个TAB位置)

\n

换行(LF) ,将当前位置移到下一行开头

 
 
输出和输入:
输出字符的两种方式:
1、printf("%c",变量)
2、putchar(字符)

printf是输出一个字符串,putchar输出一个char。

输入字符的两种方式:
1、scanf("%c",&b变量)
2、变量=getchar()

getchar是从标准输入设备读取一个char。

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位。

 

思考任务(课后练习)

  1. 八进制必须以__0___开头,十六进制必须以___0x____开头。
  2. 标识符只能由___数字____、__字母_____和__下划线_____组成。
  3. 在计算机中的进制表现形式有三种,分别是__十进制___、 __八进制_____、 _十六进制_______。
  4. C 语言提供了 sizeof 运算符,该运算符主要用于__计算数据类型字节数______。
  1. 二进制和八进制相互转换
111 010 101 011 转换为八进制后结果为?
7253
76321 转换为二进制结果为?
‭00010010101000100001‬
  1. 二进制和十六进制相互转换
1111 1010 1101 1011 转换为十六进制后结果为?
fadb
a6b2f1 转换为二进制结果为?
1010 0110 1011 0010 1111 0001
  1. 请写出-8的原码、反码、补码
原码:1000 0000 0000 1000
反码:1000 0000 0000 1001
补码:1111 1111 1111 0110
  1. 计算如下程序结果
short a = 0xfffe;
printf("%d\n", a); //结果为多少?
-32766
unsigned short a = 0xfffe;
printf("%u\n", a); //结果为多少?
65534
short a = 0x7fff + 2;
printf("%d\n", a); //结果为多少?
1
unsigned short a = 0xffff + 5;
printf("%u\n", a); //结果为多少?
5