数据类型
常量与变量
关键字:
数据类型:
char
short
int
long
float
double
unsigned
signed
struct
union
enum
void
控制语句:if else
switch
case
defalut
for
do
while
break
continue
goto
return
储存类:auto
extern
register
static
const
其他:sizeof
typedef
volatile
数据类型的作用:编译器预算对象(变量)分配的内存空间大小
变量的定义:数据类型 变量名【标识符】= 值
规则:
- 字母、数字、下划线
- 不能以数字开头、不能是关键字
- 区分大小写
特点:
- 变量在编译时为其分配相应的内存空间
- 通过名字或地址访问相应内存
常量的定义:const 数据类型 常量名 【无法改变值】 | #define 常量名 值
注意:
#define
是通过值来匹配数据类型【宏定义】const
修饰的常量是不安全,可通过指针来修改
进制
二进制
特点:逢二进一
符号 | 具体含义 |
---|---|
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 |
十进制
十进制转二进制:除二反序取余法
二进制转十进制:权值法
八进制转十进制:除八反序取余法
类似于前面的二进制
八进制转二进制:八四二一法则
二进制转八进制即逆回去就阔以了
八进制 | 二进制 |
---|---|
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
10 | 1000 |
十六进制转二进制 |
程序中的进制
八进制:开头加
0
十六进制:开头加0X
程序输出
%o
:八进制%x
:十六进制%X
:十六进制大写输出
数值存储方式
原码
特点:
- 最高位做为符号位,0表示正,为1表示负
- 其它数值部分就是数值本身绝对值的二进制数
- 负数的原码是在其绝对值的基础上,最高位变为1下面数值以1
十进制数 | 原码 |
---|---|
+15 | 0000 1111 |
-15 | 1000 1111 |
+0 | 0000 0000 |
-0 | 1000 0000 |
原码表示法简单易懂,与带符号数本身转换方便,只要符号还原即可,但当
两个正数相减
或不同符号数相加
时,必须比较两个数哪个绝对值大
,才能决定减谁,才能确定结果是正还是负,所以原码不便于加减运算
。
反码
我们用第一位表示符号(0为非负数,1为负数),剩下的位,【非负数保持不变,负数按位求反】:
[+8] = [00001000]原 = [0000 1000]反
[-8] = [10001000]原 = [1111 0111]反
补码:正数的补码等于他的原码
补码
特点:
- 计算机系统中,数值一律用补码来存储
- 对于正数,原码、反码、补码相同
- 对于负数,其补码为它的反码加1
- 补码符号位不动,其他位求反,最后整个数加1,得到原码
负数的补码等于他的原码自低位向高位,尾数的第一个‘1’
及其右边的‘0’
保持不变,左
边的各位按位取反
,符号位不变
;
十进制数 | 补码 |
---|---|
+15 | 0000 1111 |
-15 | 1111 0001 |
+0 | 0000 0000 |
-0 | 0000 0000 |
在这里就不过多介绍,阔以看看这边文章 原码、反码、补码
位的位移
C语言 | 【耗费一夜总结三本C语言系列】之 位及进制的用法
关键字
sizeof
不需要包含任何头文件,只是计算数据类型的大小【字节】
返回值为size_t
【该类型在32位系统下是unsigned int
】
char【1】 < short【2】< int long float【4】< double【8】
int
输出方式
%d
:输出一个有符号的10进制int类型%o
:输出八进制的int类型%x
:输出十六进制,字母以小写输出%X
:输出十六进制,字母大写输出%u
:输出一个10进制的无符号数
输入方式
scanf("%d", &a)
注意:
- 需要注意的是,整型数据在内存中占的字节数与所选择的操作系统有关。虽然C语言标准中没有明确规定整型数据的长度,但1ong类型整数的长度不能短于int类型,short 类型整数的长度不能短于int类型。
- 当一个小的数据类型赋值给一个大的数据类型,不会出错,因为编译器会自动转化。但当一个大的类型赋值给一个小的数据类型,那么就可能丢失高位。
long、short
整形常量 | 所需类型 |
---|---|
6 | int |
6l, 6L | long类型 |
6ll, 6LL | long long类型 |
6u, 6U | unsigned int |
6ul, 6UL | unsigned long |
6ull, 6ULL | unsigned long long |
打印格式
%hd
: 输出short类型%l
:输出long类型%ll
:输出long long类型%hu
:输出unsigned short类型%u
:输出unsigned int类型%lu
:输出unsigned long类型%llu
:输出unsigned long long类型
char
定义
- 字符型变量用于存储一个单一字符,在C语言中用char表示,其中每个字符变量都会占用1个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(’)把字符括起来。
- 字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。
输出方式
prinft("%c",a)
putchar('')
输入方式
getchar("")
scanf("%c", &a)
ASCII
- AI非打印控制字符:ASCI表上的数字0-31分配给了控制字符,用于控制像打印机等一些外围设备。
- ASCI打印字符:数字2-126分配给了能在键盘上找到的字符,当查看或打印文档时就会出现。数字127代表Del命令
转义字符
转义字符 | 含义 | ASCII |
---|---|---|
\a | 警报 | 007 |
\b | 退格,将当前位置移到前一列 | 008 |
\f | 换页,将当前位置移到下页开头 | 012 |
\n | 换行,将当前位置移到下一行开头 | 010 |
\r | 回车将当前位置移到本行开头 | 013 |
\t | 水平制表 | 009 |
\v | 垂直制表 | 011 |
\\ | 代表一个\ 字符 | 092 |
\' | 代表' | 039 |
\" | 代表一个" | 034 |
\? | 代表一个? | 063 |
\0 | 数字0 | 000 |
\ddd | 八进制转义字符,d范围0~7 | 3位八进制 |
\xhh | 16进制转义字符,h范围0-9,a-f,A-F | 3位十六进制 |
数值溢出
当超过一个数据类型能够存放最大的范围时,数值会溢出。
有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。
char
| 1字节 | -128到127unsigned char
| 1字节 | 0到255
float、double
区别
float
:7位有效数字
double
:15~16位有效数字
e3
:10的三次幂
类型限定符
extern
:声明一个变量,但没有建立存储空间
const
:定义一个常量,不能修改
volatile
:防止编译器优化代码
register
:定义寄存器变量,提高效率。若CPU空闲则有效。