一、数据类型基本知识点
1、什么是数据类型。
数据集合的划分,不同数据类型对CPU的意义是不一样的
2、数据类型的分类
二、数据类型重要知识点
1、字节长度
bit 位
字节 1字节 = 8bit
半字 1个半字 = 2个字节
字 1个字 = 4个字节。(在32位系统中)
2、sizeof与strlen的区别
char str[20]=”0123456789”;
int a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0’为字符串结束标记。
int b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响
char *str1=”absde”;
char str2[]=”absde”;
char str3[8]={‘a’,};
char ss[] = “0123456789”;
输出:
sizeof(str1)=4
sizeof(str2)=6;
sizeof(str3)=8;
sizeof(ss)=11
首先说明一点,char类型占一个字节,所以sizeof(char)是1,这点要理解
str1是一个指针,只是指向了字符串”absde”而已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间。所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节
str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的总空间,所以sizeof(str2)取得的是字符串”absde”占的总空间。”absde”中,共有a b s d e \0六个字符,所以str2数组的长度是6,所以sizeof(str2)=6*sizeof(char)=6。
str3已经定义成了长度是8的数组,所以sizeof(str3)为8。
str4和str2类似,’0’ ‘1’ … ‘9’加上’\0’共11个字符,所以ss占的空间是8
总之,对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清,而且char * =”aaa”的写法现在不被提倡,应予以避免。
而strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。
sizeof
sizeof(…)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。strlen
strlen(…)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。参考资料
Sizeof与Strlen的区别与联系(转)
- sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
- sizeof是算符,strlen是函数。
sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。
sizeof还可以用函数做参数,比如:short f();
printf(“%d\n”, sizeof(f()));
输出的结果是sizeof(short),即2。数组做sizeof的参数不退化,传递给strlen就退化为指针了。
大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
char str[20]="0123456789"; int a=strlen(str); //a=10; int b=sizeof(str); //而b=20;
strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址
如:
fun(char [8])
fun(char [])
都等价于 fun(char *)我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度
看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:
char str[20]=”0123456789”;
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
上面是对静态数组处理的结果,如果是对指针,结果就不一样了
char* ss = “0123456789”;
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是长整型的,所以是4
sizeof(* ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位’0’ 所占的内存空间,是char类型的,占了 1 位
strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
3、各个数据类型的取值范围
取值范围
数据溢出计算机如何处理的?
举例说明:
char ch = -128;
ch = ch - 1;
pirntf("%d",ch);
//输出:ch = 127
解释一下:char的有符号取值范围为-128 - +127;计算机中整数的补码和原码相同。负数的补码:绝对值的原码取反加一。
-128的补码就是1000 0000;
-1的补码就是1111 1111;
1000 0000
+ 1111 1111 等于1 0111 1111,最高位溢出,舍去,所以就是127.
4、无符号与有符号的区别
如何提高无符号和有符号的代码移植性?
三、变量与常量
- 什么是变量,变量的特点。
cpu + 内存 + 硬盘
内存与硬盘的区别:
(1)掉电,内存内容消失,硬盘不消失
(2)程序执行时,占用内存
(3)内存保存动态数据,硬盘保存静态数据
(4)百度补充:
内存是电脑的数据存储设备之一,其特点为容量较小,但数据传送速度较快,用以弥补硬盘虽然容量大但传送速度慢的缺点, 在电脑中内存被架设在硬盘和高速缓存器(容量比内存更小同时速度比内存更快的存储器,架设在内存和CPU之间)之间,从而可以充分发挥CPU的运算能力,不至于使CPU的高速运算能力因数据提取速度过慢而浪费,所以,电脑的运行速度是由CPU,高速缓存器以及内存等存储设备共同决定的;硬盘是电脑中用来存放文件(包括系统文件)的数据存储设备,特点是存储容量大,但数据传送速度慢内存(稀缺资源):共享资源 操作系统:管理资源
下面讲一下变量在内存中的存储方式。
进程的虚拟地址空间
栈空间的特点:
- 先进后出
- 系统管理(内存的分配与释放)
堆空间的特点:
- 用户管理
- 先进先出
分配内存的三种方式:
栈空间、堆空间、数据区
全局变量与局部变量的区别:
全局变量在数据区,局部变量在栈空间
初始化时,全局变量自动置位0,局部变量为垃圾值
全局变量的作用域为整个程序,在整个程序执行完后被释放,局部变量的作用域仅在它所在的函数内部,函数结束后被释放。
当全局变量与局部变量重名时,局部变量优先级高
实际内存给分配2M(不同操作系统可能不一样)的物理内存。程序执行时,把虚拟空间映射到物理内存2M上
当执行完毕,再映射2M到物理内存的2M空间上
MMU:内存管理单元(把虚拟空间映射到物理内存)