数据类型
作用:编译器预算对象(变量)分配的内存大小
变量
- 在程序运行过程中,其值可以改变
- 变量在使用前必须先定义,定义变量前必须有相应的数据类型
- 标识符不能是关键字
- 标识符只能由字母、数字、下划线组成
- 第一个字符必须为字母或下划线
- 字母区分大小写
- 在编译时为其分配相应的内存空间
- 可以通过其名字和地址访问相应内存
- extern声明变量的时候内存中不会创建存储空间,只表示声明,并没有定义
- 当变量没有进行声明,直接定义变量时,如:int b;它既是声明也是定义,此时内存中会开辟存储空间
进制
概念:逢X进一位就是X进制
二进制
计算机中采用的进制,逢二进一,数据在计算机中主要是以补码的形式存储的
单位:
术语 | 含义 |
---|---|
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 |
八进制
缩写为OCT或O,逢八进一,八进制的数和二进制数可以按位对应(八进制一位对应二进制三位,取三合一),表示八进制时以数字0开头
Snip20190214_7.png十六进制
由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9,A-F对应10-15,十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位,取四合一),表示十六进制时以0x开头
Snip20190214_10.png进制间转换
十进制整数转二进制:十进制数除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果
eg:
Snip20190214_5.png十进制小数转二进制:小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果
注意点:
- 乘的时候只乘小数部分
- 如十进制为3为小数,则二进制也为3为即可
eg:
Snip20190214_13.png十进制转八进制:十进制数除以8,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果
eg:
Snip20190214_8.png十进制转十六进制:十进制数除以16,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果
eg:
Snip20190214_12.png内存数值存储方式
在计算机系统中,数值一律用补码来存储
原因如下:
- 统一了零的编码
- 将符号位和其它位统一处理
- 将减法运算转变为加法运算
原码
概念:原始的二进制码
- 最高位做为符号位,0表示正,为1表示负
- 其它数值部分就是数值本身绝对值的二进制数
eg:
十进制数 | 原码 |
---|---|
+14 | 0000 1110 |
-14 | 1000 1110 |
+0 | 0000 0000 |
-0 | 1000 0000 |
反码
特点:
- 对于正数,反码与原码相同
- 对于负数,符号位不变(即最高位不变),其它部分取反(1变0,0变1)
eg:
十进制数 | 反码 |
---|---|
+14 | 0000 1110 |
-14 | 1111 0001 |
+0 | 0000 0000 |
-0 | 1111 1111 |
补码
计算机系统中,数值一律用补码来存储
特点:
- 对于正数,原码、反码、补码相同
- 对于负数,其补码为它的反码加1
- 补码符号位不动,其他位求反,最后整个数加1,得到原码
十进制数 | 补码 |
---|---|
+14 | 0000 1110 |
-14 | 1111 0010 |
+0 | 0000 0000 |
-0 | 0000 0000 |
整型:int
输出
打印格式 | 含义 |
---|---|
%d | 输出一个有符号的10进制int类型 |
%o(字母o) | 输出8进制的int类型 |
%x | 输出16进制的int类型,字母以小写输出 |
%X | 输出16进制的int类型,字母以大写写输出 |
%u | 输出一个10进制的无符号数 |
void test1(){
int a = 123; //定义变量a,以10进制方式赋值为123
int b = 0567; //定义变量b,以8进制方式赋值为0567
int c = 0xabc; //定义变量c,以16进制方式赋值为0xabc
printf("int整型所占的字节数:%d\n", sizeof(int)); //4个字节,一个字节占8位,即共能放32位
printf("a = %d\n", a);
printf("8进制:b = %o\n", b);
printf("10进制:b = %d\n", b);
printf("16进制:c = %x\n", c);
printf("16进制:c = %X\n", c);
printf("10进制:c = %d\n", c);
unsigned int d = 0xffffffff; //定义无符号int变量d,以16进制方式赋值
printf("有符号方式打印:d = %d\n", d);
printf("无符号方式打印:d = %u\n", d);
}
其余类型
数据类型 | 占用空间 |
---|---|
short(短整型) | 2字节 |
int(整型) | 4字节 |
long(长整形) | Windows为4字节,Linux为4字节(32位),8字节(64位) |
long long(长长整形) | 8字节 |
void test2(){
//环境:Mac64位电脑
printf("int整型所占的字节数:%d\n", sizeof(int)); //4个字节,一个字节占8位,即共能放32位
printf("short所占的字节数:%d\n", sizeof(short)); //2个字节,一个字节占8位,即共能放16位
printf("long所占的字节数:%d\n", sizeof(long)); //8个字节,一个字节占8位,即共能放64位
printf("long long所占的字节数:%d\n", sizeof(long long)); //8个字节,一个字节占8位,即共能放64位
}
整型常量 | 所需类型 |
---|---|
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类型 |
有符号数
最高位为符号位,0代表正数,1代表负数
无符号数
最高位不是符号位,而就是数的一部分,无符号数不可能是负数
数据类型 | 占用空间 | 取值范围 |
---|---|---|
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) |
字符型:char
概念
用一对英文半角格式的单引号(' ')把字符括起来,本质就是一个1字节大小的整型
void test3(){
char ch = 'a';
printf("sizeof(ch) = %u\n", sizeof(ch));// 1
printf("ch = %c\n", ch); //打印字符 ‘a’ ASCII的值
printf("ch = %d\n", ch); //打印97
char A = 'A';
char a = 'a';
printf("a = %d\n", a); //97
printf("A = %d\n", A); //65
printf("A = %c\n", 'a' - 32); //小写a转大写A
printf("a = %c\n", 'A' + 32); //大写A转小写a
ch = ' ';
printf("空字符:%d\n", ch); //空字符ASCII的值为32
printf("A = %c\n", 'a' - ' '); //小写a转大写A
printf("a = %c\n", 'A' + ' '); //大写A转小写a
}
ASCII对照表
ASCII****值 | 控制字符 | ASCII****值 | 字符 | ASCII****值 | 字符 | ASCII****值 | 字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
转义字符
转义字符 | 含义 | ASCII****码值(十进制) |
---|---|---|
\a | 警报 | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\ | 代表一个反斜线字符"" | 092 |
' | 代表一个单引号(撇号)字符 | 039 |
" | 代表一个双引号字符 | 034 |
? | 代表一个问号 | 063 |
\0 | 数字0 | 000 |
\ddd | 8进制转义字符,d范围0~7 | 3位8进制 |
\xhh | 16进制转义字符,h范围09,af,A~F | 3位16进制 |
浮点型:float、double
数据类型 | 占用空间 | 有效数字范围 |
---|---|---|
float | 4字节 | 7位有效数字 |
double | 8字节 | 15~16位有效数字 |
类型限定符
限定符 | 含义 |
---|---|
extern | 声明一个变量,extern声明的变量没有建立存储空间。 extern int a; |
const | 定义一个常量,常量的值不能修改。 const int a = 10; |
volatile | 防止编译器优化代码 |
register | 定义寄存器变量,提高效率。register是建议型的指令,而不是命令型的指令,如果CPU有空闲寄存器,那么register就生效,如果没有空闲寄存器,那么register无效。 |
字符串格式化输出和输入
打印格式 | 对应数据类型 | 含义 |
---|---|---|
%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进制形式输出指针 |
%% | % | 输出一个百分号 |
网友评论