数据类型(1)

一、数据类型基本知识点
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计入字符串的长度的。

  1. sizeof

    sizeof(…)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
    具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
    数组——编译时分配的数组空间大小;
    指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
    类型——该类型所占的空间大小;
    对象——对象的实际占用空间大小;
    函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。

  2. strlen

    strlen(…)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
    它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。

  3. 参考资料

Sizeof与Strlen的区别与联系(转)

  1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
  2. sizeof是算符,strlen是函数。
  3. sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。
    sizeof还可以用函数做参数,比如:short f();
    printf(“%d\n”, sizeof(f()));
    输出的结果是sizeof(short),即2。

  4. 数组做sizeof的参数不退化,传递给strlen就退化为指针了。

  5. 大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因

    char str[20]="0123456789";
    int a=strlen(str); //a=10; 
    int b=sizeof(str); //而b=20;
    
  6. strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。

  7. .sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

  8. 当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
    sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸

  9. 数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址
    如:
    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、无符号与有符号的区别
这里写图片描述
如何提高无符号和有符号的代码移植性?
这里写图片描述

三、变量与常量

  1. 什么是变量,变量的特点。
    这里写图片描述
  2. cpu + 内存 + 硬盘

    内存与硬盘的区别:
    (1)掉电,内存内容消失,硬盘不消失
    (2)程序执行时,占用内存
    (3)内存保存动态数据,硬盘保存静态数据
    (4)百度补充:
    内存是电脑的数据存储设备之一,其特点为容量较小,但数据传送速度较快,用以弥补硬盘虽然容量大但传送速度慢的缺点, 在电脑中内存被架设在硬盘和高速缓存器(容量比内存更小同时速度比内存更快的存储器,架设在内存和CPU之间)之间,从而可以充分发挥CPU的运算能力,不至于使CPU的高速运算能力因数据提取速度过慢而浪费,所以,电脑的运行速度是由CPU,高速缓存器以及内存等存储设备共同决定的;硬盘是电脑中用来存放文件(包括系统文件)的数据存储设备,特点是存储容量大,但数据传送速度慢

     内存(稀缺资源):共享资源
      操作系统:管理资源
    

    下面讲一下变量在内存中的存储方式。

    进程的虚拟地址空间
    这里写图片描述

栈空间的特点:

  1. 先进后出
  2. 系统管理(内存的分配与释放)

堆空间的特点:

  1. 用户管理
  2. 先进先出

分配内存的三种方式:
栈空间、堆空间、数据区

全局变量与局部变量的区别:

  1. 全局变量在数据区,局部变量在栈空间

  2. 初始化时,全局变量自动置位0,局部变量为垃圾值

  3. 全局变量的作用域为整个程序,在整个程序执行完后被释放,局部变量的作用域仅在它所在的函数内部,函数结束后被释放。

  4. 当全局变量与局部变量重名时,局部变量优先级高

    实际内存给分配2M(不同操作系统可能不一样)的物理内存。程序执行时,把虚拟空间映射到物理内存2M上
    当执行完毕,再映射2M到物理内存的2M空间上
    MMU:内存管理单元(把虚拟空间映射到物理内存)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值