数据的存储

一、数据类型

类型名称字节数(32位)字节数(64位)
char字符型11
short (int)短整型22
int整型44
unsigned int无符号整型44
float单精度浮点44
double双精度浮点88
long长整型48
long long更长的整型88
unsigned long无符号长整型48

数据类型的意义:

1、充分利用内存资源

程序是在内存中运行的,数据类型的出现把数据分成了所需内存大小不同的数据,在开发时,需要用到大数据时才申请大内存,可以用占用内存小的数据类型解决时就用小的数据类型,这样就可以充分的利用内存。例如,我们在小时候睡觉睡的是婴儿床,因为身子小足够睡,长大了则睡单人床。

2、处理速度更高效

使用数据类型声明和初始化的变量只能存储该类型数据,并且在很多的开发语言中对数据类型有着特定的优化,这意味着开发工具在遇到该类型时有着特定的处理方式,可以以更高效的方式处理该类型数据,例如age(年龄)可以声明为数字类型的变量或常量,因为年龄总是由数字组成。

3、更清晰的代码逻辑

还是举上面这个age的栗子,在age声明为短整形时,意味着age只能赋值数字类型的值,如果我们疏忽大意给age赋值了一个字符串(如:张三),这时候开发工具会报错,告诉你age只能赋值数字类型,这样就相当于有了一个限制,这有助于代码逻辑的清晰,有利于在程序的开发和后期的维护。

4、不同的功用

不同的数据类型有着其各自特定的作用,例如数字类型可以使用加减乘除等,而字符串、布尔等其他类型是不可以进行运算的因此不能具有该功用;布尔类型是用来判断的,而数字或其他类型则不具有该功用。

 (一)整型

1、char:字符型数据

(1)unsigned char:无符号字符型数据

                数据范围:0 ~ 255

(2)signed char:有符号字符型数据

                数据范围:-127 ~ 127

 TIPS:(为什么将字符型数据归类到整型数据中)

1、字符的本质是ASCII码值,ASCII码值也属于整型的一种。

2、char到底是signed char还是unsigned char,在c语言标准中是未定义的,因此取决于编译器。

2、short (int):短整型数据

(1)unsigned short (int):无符号短整型数据

                数据范围:0 ~ 655335

(2)signed short (int):有符号短整型数据

                数据范围:-32768 ~ 32767

3、int:整型数据(默认为signed int数据)

(1)unsigned int:无符号整型数据

                数据范围:0 ~ 4294967295

(2)signed int:有符号整型数据

                数据范围:-32768 ~ 32767

4、long (int):长整型数据

(1)unsigned long (int):无符号长整型数据

                数据范围:0 ~ 4294967295

(2)signed long (int):有符号长整型数据

                数据范围: -2147483648 ~ 2147483647

5、long long (int):更长的整型数据

(1)unsigned long long (int):更长的无符号长整型数据

                数据范围:-9223372036854775808 ~ 9223372036854775807

(2)signed long long (int):更长的有符号长整型数据

                数据范围:0 ~ 18446744073709551615

(二)浮点型

1、float(单精度浮点数):精度较低,存储的位数比较少。(有效位数:6 ~ 7位)

2、double(双精度浮点数):精度较高,存储的位数较多。(有效位数:15 ~ 16位)

(三)构造结构

1、数组类型

2、结构体类型:struct

3、枚举类型:enum

4、联合类型:union

(四)指针类型

例:int* pi;(整形指针) char* pc(字符型指针); float* pf(浮点型指针); void* pv(空指针)

 (五)空类型 void:常用于函数返回值类型、函数参数、指针类型。

二、整型在内存中的存储 —— 原码、反码、补码

1、计算机在存储整型数据的时候,是以补码的形式储存的。

2、定义

原码:一个数的二进制位的最高位为符号位,其中符号位为0表示正数,为1则表示负数的二进制数。

反码:正数的反码与原码保持一致,负数的反码是对原码按位取反,只是最高位(符号位)保持不变 。

 补码:正数的补码与原码仍然保持一致;负数的补码是在该数的反码+1。

5-5
原码0000010110000101
反码0000010111111010
补码0000010111111011

3、原码,反码和补码存在的意义

原码,反码和补码是完全不同的,既然原码才是被人脑能直接识别并用于计算的表达方式,为何还会有反码和补码呢?

首先,人脑可以知道第一位是符号位,在计算的时候我们会根据符号位,选择对真值区域进行加减。但对于计算机而言,加减乘除已经是最基本的运算操作,要设计的尽量简单。而计算机辨别“符号位”显然会让计算机的基础电路设计变得十分复杂,于是人们想到了将符号位也参与运算的方式。

首先我们知道,根据运算法则,减去一个正数实质上就是等于加上这个数的负数,即: 1 - 1 = 1 + ( -1 ) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了. 

于是人们开始探索 将符号位参与运算, 并且只保留加法的方法. 首先来看原码:

计算十进制的表达式: 1-1=0
原码:1 - 1 = 1 + (-1) = [0000 0001] + [1000 0001] = [1000 0010] = -2

如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的。这也就是为何计算机内部不使用原码表示一个数。

为了解决原码做减法的问题,出现了反码:

计算十进制的表达式: 1-1=0
反码:1 - 1 = 1 + (-1) = [0000 0001] + [1000 0001]= [0000 0001] + [1111 1110] = [1111 1111] = [1000 0000] = -0

发现用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在"0"这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0。

于是补码的出现, 解决了0的符号以及两个编码的问题:

1 - 1 = 1 + ( -1 ) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补 = [0000 0000]原

这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:

(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补

-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示。

使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].

因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-2^{32}2^{32}-1] 。因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值. 

三、大小端

1、定义

(1)大端字节序存储:把一个数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。(正着存)

(2)小端字节序存储:把一个数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中。(倒着存)

2、为什么会有大小端之分

大小端问题主要涉及的是非单字节非字符串外的其余数据的表示和传递,如short型、int型等。大端和小端有其各自的优势。我们知道计算机正常的内存增长方式是从低到高(当然栈不是),取数据方式是从基址根据偏移找到他们的位置,从他们的存储方式可以看出,大端存储因为第一个字节就是高位,从而很容易知道它是正数还是负数,对于一些数值判断会很迅速。而小端存储 第一个字节是它的低位,符号位在最后一个字节,这样在做数值四则运算时从低位每次取出相应字节运算,最后直到高位,并且最终把符号位刷新,这样的运算方式会更高效。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值