2.C语言数据类型

数据类型

作用:编译器预算对象(变量)分配的内存大小

Snip20190214_4.png

变量

  1. 在程序运行过程中,其值可以改变
  2. 变量在使用前必须先定义,定义变量前必须有相应的数据类型
  3. 标识符不能是关键字
  4. 标识符只能由字母、数字、下划线组成
  5. 第一个字符必须为字母或下划线
  6. 字母区分大小写
  7. 在编译时为其分配相应的内存空间
  8. 可以通过其名字和地址访问相应内存
  9. extern声明变量的时候内存中不会创建存储空间,只表示声明,并没有定义
  10. 当变量没有进行声明,直接定义变量时,如: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,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果

注意点

  1. 乘的时候只乘小数部分
  2. 如十进制为3为小数,则二进制也为3为即可

eg:

Snip20190214_13.png

十进制转八进制:十进制数除以8,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果

eg:

Snip20190214_8.png

十进制转十六进制:十进制数除以16,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果

eg:

Snip20190214_12.png

内存数值存储方式

在计算机系统中,数值一律用补码来存储

原因如下:

  1. 统一了零的编码
  2. 将符号位和其它位统一处理
  3. 将减法运算转变为加法运算

原码

概念:原始的二进制码

  1. 最高位做为符号位,0表示正,为1表示负
  2. 其它数值部分就是数值本身绝对值的二进制数

eg:

十进制数 原码
+14 0000 1110
-14 1000 1110
+0 0000 0000
-0 1000 0000

反码

特点

  1. 对于正数,反码与原码相同
  2. 对于负数,符号位不变(即最高位不变),其它部分取反(1变0,0变1)

eg:

十进制数 反码
+14 0000 1110
-14 1111 0001
+0 0000 0000
-0 1111 1111

补码

计算机系统中,数值一律用补码来存储

特点

  1. 对于正数,原码、反码、补码相同
  2. 对于负数,其补码为它的反码加1
  3. 补码符号位不动,其他位求反,最后整个数加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进制形式输出指针
%% % 输出一个百分号

你可能感兴趣的:(2.C语言数据类型)