数据类型
作用:告诉编译器我这个数据在内存中需要多少的空间
常量:程序运行中不能改变的量
整形常量:1,34
字符常量:’a’
字符串常量:’hello’
浮点型常量:123.32
变量
- 程序在运行中可以被改变的量,存在于内存中
- 变量需要定义:在内存中开辟空间(声名)
- 变量的定义形式:数据类型 变量名
类型 | 占用字节 |
---|---|
int | 4字节 |
short | 2字节 |
long | 在win中4字节,Linux 32位4字节,64位8字节 |
char | 1字节 |
float | 4字节 |
double | 8字节 |
- int a; 在内存中定义一个变量a,占用4字节
1 | int a; |
- 定义:在内存中开辟空间
- 初始化:定义时赋值
- extern 告诉编译器有这个东西,但是这里不开辟空间
- 变量取名不能位关键字
- 定义宏事实上即使定义常量,不可以被修改
const
- const修饰的变量不能通过变量名修改
进制
- 十进制:逢十进一
- 二进制:逢二进一
- 八进制:逢八进一
- 十六进制:逢十六进一
二进制
- c语言中不可以书写二进制
- 一个二进制0或者1代表一位,8位就是一个字节
- 1b = 1位;1B = 8位;1kb = 1024b
十进制转二进制
- 除二反向去余法
二进制转十进制
1 1 0 1
2^01 + 2^1 * 0 + 2^2* 1 + 2^31 = 13
八进制
- 书写:0123(在数字前加0)
十进制转八进制
- 除八反向去余法
八进制转十进制
- 与二进制相似
八进制转二进制
- 因为八进制最大值就是7所以我们用三个二进制位就可以表示
- 257 -> 010 101 111
- 二进制表示八进制
- 分别为三个一组
十六进制
- 十六进制0-9,a-f
- c语言中如何书写十六进制:0x1ab,0XAB
十进制转十六进制
- 除十六反向取余法
十六进制十进制
- 7 b
- 7 * 16^1 + b *16^0
十六进制转二进制
- 四个二进制可以表示一个十六进制
二进制转十六进制
- 四个一组表示一个十六进制
十六进制转八进制
- 先转二进制再转八进制
有符号数和无符号数
有符号就是可以表示正数和负数
char类型的值默认只有一字节,有八位,其中有一个位用来表示符号
- 符号位1表示是负数,0表示是正数
- 如果是int类型有1位是符号位,31位是数据位
- 有符号:最高位位符号位,其他位为数据为
- 无符号的全部是数据位置(unsigned)
- 有符号数和无符号数表示的数的个数相同,只是范围不同
数值的范围
- char
- 有符号数和无符号数能够表示的数的个数相同,只是范围不同
- 1 0000000 -1 1111111 -> -0 - -127
- 0 0000000 -0 1111111 -> +0 - +127
- 规定 -0 表示为-128
- -128 - +127(-2^7 -> 2^7-1)
- unsigned e
- 00000000 11111111
- 0 - 255
- short
- signed short(-2^15 -> 2^15-1)
- unsigned short(0 - >2 ^16 -1)
- int
- signed int(-2^31 - 2^31-1)
- unsigned int(0 -> 2^32 -1)
反码源码补码
源码
- 数的最原始的二进制码
- 120 -> 01111000
- -23 -> 10010111
- -0 :1000 0000
- +0 :0000 0000
- -1 :1000 0001
- 1 :0000 0001
- 1 + -1 ?
- 0000 0001
- 1000 0001
- 1000 0010 = -2
- 注意:负数如果在计算机中原码存,会导致两个问题负数运算结果不正确,0的状态有两种
反码
- 正数的反码不变,负数的反码(符号位不变,其他位取反)
- -0 : 1111 1111
- +0: 0000 0000
- -1: 1111 1110
- 1 : 0000 0001
- 1 + -1 = 1111 1111 = -0
- 如果计算机用反吗去存,负数运算结果正确,但是0的状态还是有两种
补码
正数的补码不变,负数的补码等于反码加1
-0: 0000 0000
+0 : 0000 0000
-1 : 1111 1111
1 : 0000 0001
1 + -1 = 0
如果用补码去存,负数运算结果是正确的,0的转台只有一种
赋值时:赋的是十进制,给的是源码,如果赋值是八进制或者十六进制,给的是补码
打印时:十进制打印要的是源码,如果十六进制或者八进制打印要的是补码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main(void)
{
//赋值时:赋的是十进制,给的是源码,如果赋值是八进制或者十六进制,给的是补码
//打印时:十进制打印要的是源码,如果十六进制或者八进制打印要的是补码
char num = 129;
//源码=反码=补码:1000 0001
//计算机认为是负数的补码
//反码:1111 1110
//原码:1111 1111
printf("num = %d\n",num);
return 0;
}
源码:1001 0111(-23)
反码:1110 1000
补码:1110 1001
- 补码求反码
符号位不变,其他位取反
1001 0110
反码求源码
- 反码加1
- 1001 0110
进制的书写
1 |
|
数在计算机中的内容没有改变 只是输出的形式改变
打印格式
%d 有符号整数
%u 无符号打印
整数的输入
scanf() :从键盘读取数据
1 |
|
- 读取的格式 0-9遇到\n结束
- 如果没有敲击\n,scanf会阻塞
sizeof()
用来测数据类型的大小
1 |
|
整数打印格式、
- %d 有符号打印int
- %u 无符号打印int
- %hd 有符号打印short
- %hu 无符号打印short
- %ld 有符号long
- %lu 无符号long
字符型
- 单个字符用单引号’’引起来
- 字符’0’的ascii值位48
- 字符’1’的ascii值是49
- ‘A’ ascii值是65
- ‘a’ asscii值是97
1 |
|
读取多个字符问题
1 |
|
%c只会读一个字符
转义字符
- \n :换行
- \a:警报
- \t:水平制表
- \v:垂直制表
- \r:将光标移到本行开头
浮点型
- 存小数的数据
- float 4字节
- double 8字节
- 打印的时候,默认输出6位的小数点
- 如果需要指定小数点后面的位数:%.7f即为输出指定位数
- float能够保证的精度是6位有效数字
- double保证的精度是15位
限定符
- extern 声名:告诉编译器有这个东西,不开辟空间
- const: 变量值,不可通过变量名字修改
- Volatile :防止编译器优化
- Register:建议将变量定义在寄存器
字符串常量
双引号中间的东西就是字符串,单引号中间的是字符
在字符串最后一个是\0的ascii值为数字0;
数字零在内存中就是0
字符0’0’ 内存中是45
\0在内存中是0
打印字符串
- 我们通常使用%s来打印字符串,遇到%0后就会停止
打印的格式问题
%m.n格式:m制的是宽度.n指的是小数点后位数
如果我们使用%-m.n表示左对齐
如果我们使用%0m.n表示用0来补齐
注意补零不能和左对齐同时使用