目录
2.2、关键字sizeof的使用说明(具体后面会更详细的解释)
3、为什么char类型的数值范围是-128~127,为啥不是-127~128?
1.1、为什么char和unsigned char属于整型?
第一部分、前言
该文章是我复习C语言的笔记,笔记中给出的各种问题及解答都是我之前不会的,或者我之前存在疑惑的,或者我新学到的,所以很多细节的地方还希望大家去参考详细的学习资料。
第二部分、初识数据类型
文章是我复习C语言的笔记,所以笔记中给出的各种问题及解答都是我之前不会的,或者我之前存在疑惑的,或者我新学到的,所以很多细节的地方还希望大家去参考详细的学习资料。
数据类型 | 名称 | 占内存的大小 | 表达的数值范围 |
char | 字符数据类型 | 1byte | -128~127 |
unsigned char | 无符号字符数据类型 | 1byte | 0~255 |
short(int) | 短整型 | 2byte | -32,768~32,767 |
unsigned short(int) | 无符号短整型 | 2byte | 0~65535 |
int | 整形 | 4byte | -2^31~-2^31-1 |
unsigned int | 无符号的整型 | 4byte | 0~2^32-1 |
long(int) | 长整型 | 4byte | -2^31~-2^31-1 |
long long(int) | 更长的整形 | 8byte | -2^63~2^63-1 |
float | 单精度浮点数 | 4byte | -3.4x10^-38 ~ 3.4x10^38 |
double | 双精度浮点数 | 8byte | -1.7x10^-308 ~ 1.7x10^308 |
1、C语言为啥要这么多的数据类型?
这么多的数据类型,其实是为了更加丰富的表达出生活中的各种数值,提高空间利用率。也可以这样理解学习C语言主要是为了和计算机沟通,增加这些数据类型能够提高与机器对话的效率。
2、表格中所占内存的大小是如何计算得到的?
2.1、计算机的内数据存储单位
在解决这个问题之前,首先明白下面两个问题:
- 计算机最小的数据存储单位是:字节(Byte)(这个很重要,记住!)
- 计算机最小的数据传输单位是:位/比特(bit)
内存的换算关系如下:
1TB = 1024GB
1GB = 1024MB
1MB = 1024KB
1Kb = 1024byte(字节)
1byte = 8 bit(比特/位)
- 那我又有一个疑问,那32位机和64位机又是什么意思呢?
其实这表示处理器一次处理数据的能力,32位 = 一次能处理32bit位的数据,64位 = 一次能处理64bit为的数据。
2.2、关键字sizeof的使用说明(具体后面会更详细的解释)
关键字sizeof:以字节为单位给出与变量或类型在内存中所占的空间大小。
3、为什么char类型的数值范围是-128~127,为啥不是-127~128?
3.1、整型数据在计算机内的编码方式
计算机中的编码方式主要有原码,反码,补码三种方式。而对于整形来说:数据存放内存中其实存放的是补码。
- 正数的原码、反码、补码三者一致;
例如:int a = 666
原码 = 反码 = 补码 = 00000000 00000000 00000010 10011010
- 负数的补码 = 原码符号位不变,取反再加1;
例如:int a = - 666
原码 = 10000000 00000000 00000010 10011010
反码 = 111111111 111111111 111111101 01100101
补码 = 111111111 111111111 111111101 01100110
- 得到了补码,怎么将补码又变成原码呢?
法一、原码 = 补码符号位不变,取反再加1;(好记)
补码 = 111111111 111111111 111111101 01100110
补码的反码 = 10000000 00000000 00000010 10011001
原码 = 10000000 00000000 00000010 10011010
法二、逆过程推算,原码 = 补码减1,符号位不变再取反 ;(不好记)
补码 = 111111111 111111111 111111101 01100110
补码减一 = 111111111 111111111 111111101 01100101
原码 = 10000000 00000000 00000010 10011010
3.2、为啥要补码?
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器减法运算是通过转化成加法运算来实现的)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
- 为啥说补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路?
由上述补码求反码的反码的方法一可知:对于负数,其补码 = 原码符号位不变,取反再加1;原码 = 补码符号位不变,取反再加1;会发现这个原码到补码,补码再到原码这个过程是一致的。
3.3、回答char类型的数值范围为啥是-128~127?
char大小为1个字节,最高位表示符号位,又因为0000 0000表示0,那么1000 0000的最高位为符号位,总不能它也表示为0,为了提高存储效率,计算机就直接将1000 0000翻译为-128。
下图可以帮助理解:
4、为啥int和long的数值范围是一样的?
正常理解下long的数值范围应该是比int数值范围要更广,但是表格中为啥一致呢?
其实这个不是绝对的,这是取决于当前的编译器,在vs2017的编译器中默认int和long的数据类型大小一致。
5、这些类型如何输出?
%d | int |
%c | char |
%s | 字符串 |
%u | unsigned int |
%f | float |
%lf | double |
%p | 打印地址printf("%p",&a);//观察a的地址,以16进制打印 |
%x | printf("%x",50);16格式进制打印 |
6、如何将一个类型转换成另一个类型?
实现类型之间的转换可以通过强制类型转换的方法来实现。如下图,8.66为浮点类型的数据,通过:(类型)变量 的方式来实现强制类型转换。
第三部分、进阶数据类型
关于数据类型进阶的知识就会设计到数据存储的问题,数据存储的文章如下:
1、整型家族
下面都为整型家族的数据类型。
char = signed char//大多数编译器都是这么规定的,但是C99没有明确规定
unsigned char
short = signed short [int]
unsigned short [int]
int = signed int
unsigned int
long = signed long [int]
unsigned long [int]
1.1、为什么char和unsigned char属于整型?
这也是我之前很疑惑的地方,其实这和计算器的存储有关系,根据ASCII码表可以知道,每个英文字母都对应一个ASCII码的数值,而这些数值都是整数。我个人的理解是字符其实在内存中是以整数的形式进行保存的。因此字符类型归属于整型家族。
1.2、26个大小写英文字母的ASCII码数值
做个记录,方便自己查找。
大写字母 | ASCII值 | 小写字母 | ASCII值 |
A | 65 | a | 97 |
B | 66 | b | 98 |
C | 67 | c | 99 |
D | 68 | d | 100 |
E | 69 | e | 101 |
F | 70 | f | 102 |
G | 71 | g | 103 |
H | 72 | h | 104 |
I | 73 | i | 105 |
J | 74 | j | 106 |
K | 75 | k | 107 |
L | 76 | l | 108 |
M | 77 | m | 109 |
N | 78 | n | 110 |
O | 79 | o | 111 |
P | 80 | p | 112 |
Q | 81 | q | 113 |
R | 82 | r | 114 |
S | 83 | s | 115 |
T | 84 | t | 116 |
U | 85 | u | 117 |
V | 86 | v | 118 |
W | 87 | w | 119 |
X | 88 | x | 120 |
Y | 89 | y | 121 |
Z | 90 | z | 122 |
2、浮点家族
float
double
第四部分、总结及内容全览
数据类型这里只是简单后复习了一下,以上为博主复习总结的一些知识点,有很多的不足,还希望读者见谅。