数据类型
定义
数据类型其实是固定大小内存的别名,并且描述了一个变量存放什么类型的数据。
数据:计算机要处理的数据(数字、字符串、文字、符号、图片、视频等)
-
数据类型不仅帮助我们组织和操作了数据,还决定了程序如何有效的利用内存
-
了解数据类型的内存需求是理解计算机管理和操作数据的关键
简单来讲:
程序的运行需要用到内存
内存存储容量单位
字节(byte):计算机存储容量的一种单位,一般应用层最小存储单元的表示
比特位(bit):二进制数(0和1)计算机是以二进制的方式进行存储的,我们应用层可以通过位运算进行位的操作
1个字节(Byte)=8位(Bit)
1个千字节(KB)=1024字节(Byte)
1M=1024KB
1GB=1024MB
1TG=1024GB
...
数据类型分类和计算方法
数据类型在内存中
序号 | 数据类型 | 中文说明 | 大小(byte) |
---|---|---|---|
1 | short | 短整型 | 2 |
2 | int | 基本整型 | 4 |
3 | long(long int) | 长整型 | 4(32位编译器)/8(64位编译器) |
4 | long long(long long int) | 长长整型 | 8 |
5 | float | 单精度浮点型 | 4 |
6 | double | 双精度浮点型 | 8 |
7 | char | 字符型 | 1 |
8 | bool(_Bool) | 布尔型,真-true,假-false | bool=1,true=4,false=4 |
注意:因为C语言没有Byte这个单位,所以我们一般使用char来表示字节,因为1char=1byte
注意:
获取某个数据类型或者变量所占的字节数→sizeof(某个数据类型或者变量名)
printf("true sizeof:%ld\n",sizeof(true));// true size:4 占4个字节printf("false sizeof:%ld\n",sizeof(false));// false size:4 占4个字节printf("bool sizeof:%ld\n",sizeof(bool));// bool size:1 占1个字节总结:
数据类型在内存中所占的字节数跟C语言的编译系统有关;
计算某个数据类型所占的字节数可以用sizeof
布尔类型要添加
#include <stdbool.h>
,大家也可以用int类型的0表示假,非0表示真
基本类型数据
整型数据
用来存放整型数据的变量
我们定义一个整型的变量,C编译系统实际是在内存中分配了一个能够存储一个整型数据的存储空间,并用变量名来标识这个空间,对该空间的使用也就可以通过变量名来访问。
若不知道你所用的C编译系统对变量分配的存储空间的大小,可用sizeof运算符查询,如:
printf("%d,%d,%d\n",sizeof(int),sizeof(short),sizeof(long));// 4,2,3
案例:
整型变量的定义和使用:
#include <stdio.h>int main(){int a,b,c,d;// 定义有符号整型变量,可以存储负数/正数unsigned int u;// 定义无符号整型变量,只能存储正数,正数的范围会变大a = 12;b = -24;c = 10;c = a + u,d = b + u;printf("a+u=%d,b+u%d\n",c,d);// a+u=22,b+u=-14}
整型数据在内存中的存放形式
-
数据在内存中是以二进制的形式存放的
如果有以下语句:
int i; // 定义i为存储整型的变量i = 10; // 给i赋整数10为值
则十进制数10的二进制形式为1010,则内存中实际的存放方式为:
-
实际上,数据在内存中是以补码的形式表示的
-
正数的补码和原码(该数的二进制形式)是相同的
-
负数的补码是将该数绝对值的二进制形式,按位取反再加1(反码+1变补码)
可见:在存放整数的存储单元中,一般情况下,最左边的一位用来表示符号位,符号位为0表示正数,符号为1表示负数。
-
浮点型数据
概念:
用来表示实数(小数)的数据类型
浮点型变量的分类
-
单精度浮点型(float):在64位系统中典型尺寸是4字节,精确到小数后6位,%f
-
双精度浮点型(double):在64位系统中典型尺寸是8字节,精确到小数点后15~16位,%lf
-
长双精度浮点型(long double):在64位系统中典型尺寸是16字节
注意:占用内存越多,能表达的精度越高
float f1; // 单精度double f2; // 双精度long double f3; // 长双精度
浮点型在内存中的存放形式
浮点型数据在内存中按照指数形式存放。系统将一个浮点数分成小数部分和指数部分,分别存放。
类别 | 符号为 | 指数为 | 小数部分 | 指数偏移量 |
---|---|---|---|---|
单精度浮点数 | 1位[32] | 8位[30~23] | 23位[22~00] | 127 |
双精度浮点数 | 1位[63] | 11位[62~52] | 52位[51~00] | 1023 |
案例:
-
要求:写出27.5在内存中的存放形式
-
解析:
-
27.5的二进制为11011.1
-
指数表示法:1.10111*2^4
-
指数:4,加上127,就是131,二进制1000 0011
-
尾数(小数点后的数):10111,补够23位:1011 1000 0000 0000 0000 000
-
用二进制表示就是(符号位1位)0(指数位8位)1000 0011(尾数为23位)1011 1000 0000 0000 0000
-
字符型数据
概念:
字符型变量用来存放字符常量。
定义:
char 变量列表;
案例:
#include <stdio.h>int main(){char c1,c2;c1 = 'A';c2 = 'B';printf("c1=%c\n",c1); // c1=A,输出的是字符本身printf("c2=%c\n",c2); // c2=B,输出的是字符本身printf("c1=%d\n",c1); // c1=65,输出的是字符对应的ASCII码编号printf("c2=%d\n",c2); // c1=66,输出的是字符对应的ASCII码编号}
说明:一个字符变量只能存放一个字符。C的编译系统都规定以一个字节的存储空间来存放一个字符,因此,一个字符变量在内存中的大小是1字节(占1个字节)
字符数据在内存中的存储形式
将一个字符常量存入一个字符变量,实际上并不是把该字符本身存入内存单元中,而是将该字符对应的ASCII码存入内存单元。
例如:
char c1 = 'a',c2 = 'b'
'a'的ASCII码为97、'b'的ASCII码为98,他们在内存中的存放形式:
实际上是按照二进制存放,形式为:
由此可见,在内存中字符数据的存储形式与整型数据类似,这就使得字符型数据和整形数据之间可以通用。也就是1个字节数据既可以字符形式输出,也可以以整数形式输出。
-
以字符形式输出时,编译系统将内存单元中的ASCII码转换成相应的字符,然后输出。
-
以整数形式输出时,直接将ASCII码作为整数输出。
-
因此,可以对字符数据进行算术运算,这时相当于对其ASCII码进行算数运算。
案例:
-
要求:给字符变量赋整数值
#include <stdio.h>main() // 此时默认返回值类型是int{char c1,c2;c1 = 97;c2 = 98;printf("%c %c \n",c1,c2); // 以字符的形式输出,a bprintf("%d %d \n",c1,c2); // 以整数的形式输出,97 98}
c1在内存的存储形式以及不同形式的输出,如下图所示:
小贴士:
字符数据只占1个字节,只能存放0~255范围内的整数。
案例:
-
要求:大小写字母转换
#include <stdio.h>int main(){char c1,c2;c1 = 'a';// 97c2 = 'b';// 98// 转大写c1 = c1 - 32;// 赋值运算,运算规则是,由右到左c2 = c2 - 32;printf("%c %c \n",c1,c2);// A B}
注意:C语言允许字符数据与整数直接进行算数运算,可以相互赋值。每一个英文小写字母比它的相应的大写字母的ASCII大32。