❶ 数据库中数据类型有哪些呢
数据类型 类型 描 述 bit 整型 bit 数据类型是整型,其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes 或No、True 或Fa lse 、On 或Off int 整型 int 数据类型可以存储从- 231(-2147483648)到231 (2147483 647)之间的整数。存储到数据库的几乎所有数值型的数据都可以用这种数据类型。这种数据类型在数据库里占用4个字节 smallint 整型 smallint 数据类型可以存储从- 215(-32768)到215(32767)之间的整数。这种数据类型对存储一些常限定在特定范围内的数值型数据非常有用。这种数据类型在数据库里占用2 字节空间 tinyint 整型 tinyint 数据类型能存储从0到255 之间的整数。它在你只打算存储有限数目的数值时很有用。 这种数据类型在数据库中占用1 个字节 numeric精确数值型 numeric数据类型与decimal 型相同 decimal 精确数值型 decimal 数据类型能用来存储从-1038-1到1038-1的固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。 范围是小数点左右所能存储的数字的总位数。精度是小数点右边存储的数字的位数 money 货币型 money 数据类型用来表示钱和货币值。这种数据类型能存储从-9220亿到9220 亿之间的数据,精确到货币单位的万分之一 smallmoney 货币型 smallmoney 数据类型用来表示钱和货币值。这种数据类型能存储从-214748.3648 到214748.3647 之间的数据,精确到货币单位的万分之一 float 近似数值型 float 数据类型是一种近似数值类型,供浮点数使用。说浮点数是近似的,是因为在其范围内不是所有的数都能精确表示。浮点数可以是从-1.79E+308到1.79E+308 之间的任意数 real 近似数值型 real 数据类型像浮点数一样,是近似数值类型。它可以表示数值在-3.40E+38到3.40E+38之间的浮点数 datetime 日期时间型 datetime数据类型用来表示日期和时间。这种数据类型存储从1753年1月1日到9999年12月3 1日间所有的日期和时间数据, 精确到三百分之一秒或3.33毫秒 Smalldatetime 日期时间型 smalldatetime 数据类型用来表示从1900年1月1日到2079年6月6日间的日期和时间,精确到一分钟 cursor 特殊数据型 cursor 数据类型是一种特殊的数据类型,它包含一个对游标的引用。这种数据类型用在存储过程中,而且创建表时不能用 timestamp 特殊数据型 timestamp 数据类型是一种特殊的数据类型,用来创建一个数据库范围内的唯一数码。 一个表中只能有一个timestamp列。每次插入或修改一行时,timestamp列的值都会改变。尽管它的名字中有“time”, 但timestamp列不是人们可识别的日期。在一个数据库里,timestamp值是唯一的 Uniqueidentifier 特殊数据型 Uniqueidentifier数据类型用来存储一个全局唯一标识符,即GUID。GUID确实是全局唯一的。这个数几乎没有机会在另一个系统中被重建。可以使用NEWID 函数或转换一个字符串为唯一标识符来初始化具有唯一标识符的列 char 字符型 char数据类型用来存储指定长度的定长非统一编码型的数据。当定义一列为此类型时,你必须指定列长。当你总能知道要存储的数据的长度时,此数据类型很有用。例如,当你按邮政编码加4个字符格式来存储数据时,你知道总要用到10个字符。此数据类型的列宽最大为8000 个字符 varchar 字符型 varchar数据类型,同char类型一样,用来存储非统一编码型字符数据。与char 型不一样,此数据类型为变长。当定义一列为该数据类型时,你要指定该列的最大长度。 它与char数据类型最大的区别是,存储的长度不是列长,而是数据的长度 text 字符型 text 数据类型用来存储大量的非统一编码型字符数据。这种数据类型最多可以有231-1或20亿个字符 nchar 统一编码字符型 nchar 数据类型用来存储定长统一编码字符型数据。统一编码用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。它允许大量的扩展字符。此数据类型能存储4000种字符,使用的字节空间上增加了一倍 nvarchar 统一编码字符型 nvarchar 数据类型用作变长的统一编码字符型数据。此数据类型能存储4000种字符,使用的字节空间增加了一倍 ntext 统一编码字符型 ntext 数据类型用来存储大量的统一编码字符型数据。这种数据类型能存储230 -1或将近10亿个字符,且使用的字节空间增加了一倍 binary 二进制数据类型 binary数据类型用来存储可达8000 字节长的定长的二进制数据。当输入表的内容接近相同的长度时,你应该使用这种数据类型 varbinary 二进制数据类型 varbinary 数据类型用来存储可达8000 字节长的变长的二进制数据。当输入表的内容大小可变时,你应该使用这种数据类型 image 二进制数据类型 image 数据类型用来存储变长的二进制数据,最大可达231-1或大约20亿字节
❷ 数据存储形式有哪几种
【块存储】
典型设备:磁盘阵列,硬盘
块存储主要是将裸磁盘空间整个映射给主机使用的,就是说例如磁盘阵列里面有5块硬盘(为方便说明,假设每个硬盘1G),然后可以通过划逻辑盘、做Raid、或者LVM(逻辑卷)等种种方式逻辑划分出N个逻辑的硬盘。(假设划分完的逻辑盘也是5个,每个也是1G,但是这5个1G的逻辑盘已经于原来的5个物理硬盘意义完全不同了。例如第一个逻辑硬盘A里面,可能第一个200M是来自物理硬盘1,第二个200M是来自物理硬盘2,所以逻辑硬盘A是由多个物理硬盘逻辑虚构出来的硬盘。)
接着块存储会采用映射的方式将这几个逻辑盘映射给主机,主机上面的操作系统会识别到有5块硬盘,但是操作系统是区分不出到底是逻辑还是物理的,它一概就认为只是5块裸的物理硬盘而已,跟直接拿一块物理硬盘挂载到操作系统没有区别的,至少操作系统感知上没有区别。
此种方式下,操作系统还需要对挂载的裸硬盘进行分区、格式化后,才能使用,与平常主机内置硬盘的方式完全无异。
优点:
1、 这种方式的好处当然是因为通过了Raid与LVM等手段,对数据提供了保护。
2、 另外也可以将多块廉价的硬盘组合起来,成为一个大容量的逻辑盘对外提供服务,提高了容量。
3、 写入数据的时候,由于是多块磁盘组合出来的逻辑盘,所以几块磁盘可以并行写入的,提升了读写效率。
4、 很多时候块存储采用SAN架构组网,传输速率以及封装协议的原因,使得传输速度与读写速率得到提升。
缺点:
1、采用SAN架构组网时,需要额外为主机购买光纤通道卡,还要买光纤交换机,造价成本高。
2、主机之间的数据无法共享,在服务器不做集群的情况下,块存储裸盘映射给主机,再格式化使用后,对于主机来说相当于本地盘,那么主机A的本地盘根本不能给主机B去使用,无法共享数据。
3、不利于不同操作系统主机间的数据共享:另外一个原因是因为操作系统使用不同的文件系统,格式化完之后,不同文件系统间的数据是共享不了的。例如一台装了WIN7/XP,文件系统是FAT32/NTFS,而Linux是EXT4,EXT4是无法识别NTFS的文件系统的。就像一只NTFS格式的U盘,插进Linux的笔记本,根本无法识别出来。所以不利于文件共享。
【文件存储】
典型设备:FTP、NFS服务器
为了克服上述文件无法共享的问题,所以有了文件存储。
文件存储也有软硬一体化的设备,但是其实普通拿一台服务器/笔记本,只要装上合适的操作系统与软件,就可以架设FTP与NFS服务了,架上该类服务之后的服务器,就是文件存储的一种了。
主机A可以直接对文件存储进行文件的上传下载,与块存储不同,主机A是不需要再对文件存储进行格式化的,因为文件管理功能已经由文件存储自己搞定了。
优点:
1、造价交低:随便一台机器就可以了,另外普通以太网就可以,根本不需要专用的SAN网络,所以造价低。
2、方便文件共享:例如主机A(WIN7,NTFS文件系统),主机B(Linux,EXT4文件系统),想互拷一部电影,本来不行。加了个主机C(NFS服务器),然后可以先A拷到C,再C拷到B就OK了。(例子比较肤浅,请见谅……)
缺点:
读写速率低,传输速率慢:以太网,上传下载速度较慢,另外所有读写都要1台服务器里面的硬盘来承担,相比起磁盘阵列动不动就几十上百块硬盘同时读写,速率慢了许多。
【对象存储】
典型设备:内置大容量硬盘的分布式服务器
对象存储最常用的方案,就是多台服务器内置大容量硬盘,再装上对象存储软件,然后再额外搞几台服务作为管理节点,安装上对象存储管理软件。管理节点可以管理其他服务器对外提供读写访问功能。
之所以出现了对象存储这种东西,是为了克服块存储与文件存储各自的缺点,发扬它俩各自的优点。简单来说块存储读写快,不利于共享,文件存储读写慢,利于共享。能否弄一个读写快,利 于共享的出来呢。于是就有了对象存储。
首先,一个文件包含了了属性(术语叫metadata,元数据,例如该文件的大小、修改时间、存储路径等)以及内容(以下简称数据)。
以往像FAT32这种文件系统,是直接将一份文件的数据与metadata一起存储的,存储过程先将文件按照文件系统的最小块大小来打散(如4M的文件,假设文件系统要求一个块4K,那么就将文件打散成为1000个小块),再写进硬盘里面,过程中没有区分数据/metadata的。而每个块最后会告知你下一个要读取的块的地址,然后一直这样顺序地按图索骥,最后完成整份文件的所有块的读取。
这种情况下读写速率很慢,因为就算你有100个机械手臂在读写,但是由于你只有读取到第一个块,才能知道下一个块在哪里,其实相当于只能有1个机械手臂在实际工作。
而对象存储则将元数据独立了出来,控制节点叫元数据服务器(服务器+对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息),而其他负责存储数据的分布式服务器叫做OSD,主要负责存储文件的数据部分。当用户访问对象,会先访问元数据服务器,元数据服务器只负责反馈对象存储在哪些OSD,假设反馈文件A存储在B、C、D三台OSD,那么用户就会再次直接访问3台OSD服务器去读取数据。
这时候由于是3台OSD同时对外传输数据,所以传输的速度就加快了。当OSD服务器数量越多,这种读写速度的提升就越大,通过此种方式,实现了读写快的目的。
另一方面,对象存储软件是有专门的文件系统的,所以OSD对外又相当于文件服务器,那么就不存在文件共享方面的困难了,也解决了文件共享方面的问题。
所以对象存储的出现,很好地结合了块存储与文件存储的优点。
最后为什么对象存储兼具块存储与文件存储的好处,还要使用块存储或文件存储呢?
1、有一类应用是需要存储直接裸盘映射的,例如数据库。因为数据库需要存储裸盘映射给自己后,再根据自己的数据库文件系统来对裸盘进行格式化的,所以是不能够采用其他已经被格式化为某种文件系统的存储的。此类应用更适合使用块存储。
2、对象存储的成本比起普通的文件存储还是较高,需要购买专门的对象存储软件以及大容量硬盘。如果对数据量要求不是海量,只是为了做文件共享的时候,直接用文件存储的形式好了,性价比高。
❸ 数据库中数据类型有哪些
Character 数据类型
Character 数据类型用来存储字母数字型数据。当你在oracle 中定义一个character 数据时,通常需要制定字段的长度,它是该字段的最大长度。ORACLE提供以下几种character 数据类型:
CHAR() CHAR数据类型是一种有固定长度和最大长度的字符串。存储在数据类型为CHAR字段中的数据将以空格的形式补到最大长度。长度定义在1——2000字节之间。
当你创建一个CHAR型字段,数据库将保证在这个字段中的所有数据是定义长度,如果某个数据比定义长度短,那么将用空格在数据的右边补到定义长度。如果长度大于定义长度将会触发错误信息。
VARCHAR() varchar型数据是varchar2型数据的快照。
VARCHAR2() varchar2数据类型是一种可变长度的、有最大长度的字母数字型数据。Varchar2类型的字段长度可以达到4000字节,Varchar2类型的变量长度可以达到32676字节。
一个空的varchar2(2000)字段和一个空的varchar2(2)字段所占用的空间是一样的。
NCHAR() 和 NVARCHAR2() NCHAR() 和 NVARCHAR2()数据类型分别与CHAR() 和 VARCHAR2()类型是相同的,只不过它们用来存储NLS(National Language Support)数据。
LONG LONG 数据类型是一个遗留下来的而且在将来不会被支持的数据类型。它将被LOB(Large Object)数据类型所代替。
比较规则 Varchar2和char数据类型根据尾部的空格有不同的比较规则。对Char型数据,尾部的空格将被忽略掉,对于Varchar2型数据尾部带空格的数据排序比没有空格的要大些。比如:
Char 型数据: ‘YO’=‘YO ’
Varchar2型数据: ‘YO’<’YO ’
Numberic 数据类型
Numberic 数据类型用来存储负的和正的整数、分数和浮点型数据,范围在-1*10-103 和9.999…99*10125之间,有38位的精确度。标识一个数据超出这个范围时就会出错。
Number(
,) Number数据类型存储一个有p位精确度的s位等级的数据。
DATE 数据类型
DATE 数据类型用来存储日期和时间格式的数据。这种格式可以转换为其他格式的数据去浏览,而且它有专门的函数和属性用来控制和计算。以下的几种信息都包含在DATE数据类型中:
Century
Year
Month
Day
Hour
Minute
Second
LOB 数据类型
LOB(Large Object) 数据类型存储非结构化数据,比如二进制文件,图形文件,或其他外部文件。LOB 可以存储到4G字节大小。数据可以存储到数据库中也可以存储到外部数据文件中。LOB数据的控制通过DBMS_LOB 包实现。BLOB, NCLOB, 和CLOB 数据可以存储到不同的表空间中,BFILE存储在服务器上的外部文件中。LOB数据类型有以下几种:
BLOB: 二进制数据
CLOB: 字符型数据
BFILE: 二进制文件
其他数据类型
ROWID ROWID 数据类型是ORACLE数据表中的一个伪列,它是数据表中每行数据内在的唯一的标识。
❹ 存储的数据类型
计算机处理数据的单位叫word,我们一般说的32位64位计算机就是指word。为了提高处理效率,数据尽量不要或少跨word存储。这就需要数据的存储地址是数据长度的整数倍,和类型长度一样,对齐的单位一般是2的幂。基本类型对齐单位是其类型长度,组合类型(数组、结构、联合)的对齐单位是其成员的最大对齐单位。由于默认对齐的存在,组合类型的成员之间可能有一些空隙,sizeof的结果可能不是简单的累加了。但要注意,组合类型的成员总是尽量向低地址靠齐,所以组合类型的开头是不会有空隙的。
❺ 什么是结构化的数据存储类型
结构化数据存储,就是把数据按照一定的结构存储起来,比如ios的NSDictionary,一个健对应一个值。以便于操作数据的时候方便操作,
一般有3种
键值归档(一个键,对应一个值,按键取值)
属性列表(诸如xml文件存储之类的)
数据库存储(直接存储数据库)
❻ 计算机可存储的常见的数据类型有那些举例说明。
1. 字符串数据类型
char
此数据类型可存储1~8000个定长字符串,字符串长度在创建时指定;如未指定,默认为char(1)。每个字符占用1byte存储空间。
nchar
此数据类型可存储1~4000个定长Unicode字符串,字符串长度在创建时指定;如未指定,默认为nchar(1)。每个字符占用2bytes存储空间。
varchar
此数据类型可存储最大值为8000个字符的可变长字符串。可变长字符串的最大长度在创建时指定,如varchar(50),每个字符占用1byte存储空间。
nvarchar
此数据类型可存储最大值为4000个字符可变长Unicode字符串。可变长Unicode字符串的最大长度在创建时指定,如nvarchar(50),每个字符占用2bytes存储空间。
text
此数据类型可存储最大值为2147483647个字符的变长文本,并且无需指定其初始值,每个字符占用1byte存储空间,一般用来存储大段的文章。text数据类型实际上是一个Large Object数据类型,默认情况下,此类型的数据不是存储在数据行内,而是存储于独立的Large Object数据页上。另外,text数据类型不能做为函数、存储过程或触发器中的参数来用。
ntext
同text数据类型,只不过存储的是最大值为1073741823个字符的Unicode变长文本,每个字符占用1byte存储空间。
说明:无论使用哪种字符串数据类型,字符串值必须放在引号内,推荐使用单引号。
2. 数值数据类型
bit
此数据类型存储值为0或1的二进制字段。占用1byte存储空间。
tinyint
此数据类型存储0~255的整数,占用1byte存储空间。
smallint
此数据类型存储-32768~32767的整数,占用2bytes存储空间。
int
此数据类型存储-2147483648~2147483647的整数,占用4bytes存储空间。
bigint
此数据类型存储-9223372036854775808~9223372036854775807的整数,占用8bytes存储空间。
decimal/numeric
这两个数据类型功能相同,均为存储精度可变的浮点值。但推荐采用decimal,因其存储的数据“更有说明性”。此种数据类型由两个值来确定decimal(p,s),p为精度,s为标量,如decimal(3,2),其中数值2为小数的位数,那么decimal(3,2)可用来存储如1.28这样的浮点数。此种数据类型占用的存储空间取决于精度值p。p为1~9,占用5bytes存储空间;p为10~19,占用9bytes存储空间;p为20~28,占用13bytes存储空间;p为29~38,占用17bytes存储空间。
❼ sql数据库中常用的数据类型有什么
一、整数数据类型:整数数据类型是最常用的数据类型之一。
1、INT(INTEGER)
INT (或INTEGER)数据类型存储从-2的31次方 (-2 ,147 ,483 ,648) 到2的31次方-1 (2 ,147 ,483,647) 之间的所有正负整数。每个INT 类型的数据按4 个字节存储,其中1 位表示整数值的正负号,其它31 位表示整数值的长度和大小。
2、SMALLINT
SMALLINT 数据类型存储从-2的15次方( -32, 768) 到2的15次方-1( 32 ,767 )之间的所有正负整数。每个SMALLINT 类型的数据占用2 个字节的存储空间,其中1 位表示整数值的正负号,其它15 位表示整数值的长度和大小。
二、浮点数据类型:浮点数据类型用于存储十进制小数。浮点数值的数据在SQL Server 中采用上舍入(Round up 或称为只入不舍)方式进行存储。
1、REAL数据类型
REAL数据类型可精确到第7 位小数,其范围为从-3.40E -38 到3.40E +38。 每个REAL类型的数据占用4 个字节的存储空间。
2、FLOAT
FLOAT数据类型可精确到第15 位小数,其范围为从-1.79E -308 到1.79E +308。 每个FLOAT 类型的数据占用8 个字节的存储空间。 FLOAT数据类型可写为FLOAT[ n ]的形式。n 指定FLOAT 数据的精度。n 为1到15 之间的整数值。
当n 取1 到7 时,实际上是定义了一个REAL 类型的数据,系统用4 个字节存储它;当n 取8 到15 时,系统认为其是FLOAT 类型,用8 个字节存储它。
三、二进制数据类型
1、BINARY
BINARY 数据类型用于存储二进制数据。其定义形式为BINARY( n), n 表示数据的长度,取值为1 到8000 。在使用时必须指定BINARY 类型数据的大小,至少应为1 个字节。BINARY 类型数据占用n+4 个字节的存储空间。
在输入数据时必须在数据前加上字符“0X” 作为二进制标识,如:要输入“abc ”则应输入“0xabc ”。若输入的数据过长将会截掉其超出部分。若输入的数据位数为奇数,则会在起始符号“0X ”后添加一个0,如上述的“0xabc ”会被系统自动变为“0x0abc”。
2、VARBINARY
VARBINARY数据类型的定义形式为VARBINARY(n)。 它与BINARY 类型相似,n 的取值也为1 到8000, 若输入的数据过长,将会截掉其超出部分。
不同的是VARBINARY数据类型具有变动长度的特性,因为VARBINARY数据类型的存储长度为实际数值长度+4个字节。当BINARY数据类型允许NULL 值时,将被视为VARBINARY数据类型。
四、逻辑数据类型
1、BIT:BIT数据类型占用1 个字节的存储空间,其值为0 或1 。如果输入0 或1 以外的值,将被视为1。 BIT 类型不能定义为NULL 值(所谓NULL 值是指空值或无意义的值)。
五、字符数据类型:字符数据类型是使用最多的数据类型。它可以用来存储各种字母、数字符号、特殊符号。一般情况下,使用字符类型数据时须在其前后加上单引号’或双引号” 。
1、CHAR
CHAR 数据类型的定义形式为CHAR[ (n) ]。 以CHAR 类型存储的每个字符和符号占一个字节的存储空间。n 表示所有字符所占的存储空间,n 的取值为1 到8000, 即可容纳8000 个ANSI 字符。
若不指定n 值,则系统默认值为1。 若输入数据的字符数小于n,则系统自动在其后添加空格来填满设定好的空间。若输入的数据过长,将会截掉其超出部分。
SQL包括了所有对数据库的操作,主要是由4个部分组成:
1、数据定义:这一部分又称为“SQL DDL”,定义数据库的逻辑结构,包括定义数据库、基本表、视图和索引4部分。
2、数据操纵:这一部分又称为“SQL DML”,其中包括数据查询和数据更新两大类操作,其中数据更新又包括插入、删除和更新三种操作。
3、数据控制:对用户访问数据的控制有基本表和视图的授权、完整性规则的描述,事务控制语句等。
4、嵌入式SQL语言的使用规定:规定SQL语句在宿主语言的程序中使用的规则。
❽ 什么是变量的存储类型
C语言的变量有4种存储类型,分别是auto(自动型)、static(静态型)、register(寄存器型)和extern(外部型)。在定义或说明一个变量时可以加上存储类型关键字,以限定其存储类别。
存储类型决定了系统将在哪一个数据存储区为变量分配存储空间。auto型将在堆栈区分配存储空间;static型将在静态数据区分配存储空间;register型将在CPU内部的寄存器中分配存储空间;而extern将不为变量分配存储空间,extern声明该变量在别的地方已经分配了存储空间。
变量存储类型关键字只需加在变量定义语句类型关键字前面即可。
char ch1;/*定义了一个char型变量ch1,其存储类型默认为自动型(必须是内部变量)*/
static char ch2;/*定义了一个char型变量ch2,其存储类型指定为静态型*/
注意:以上auto型是对内部变量而言,对于外部变量不存在自动型的问题。内部变量自动在堆栈区分配空间。事实上,内部变量默认为自动型,所以auto限定词没有任何用处。
1.自动型变量
定义一个内部变量时,如果将auto加在定义语句前面,则该变量是自动型变量;定义内部变量时,如果没有加任何存储类型限定,该变量默认为自动型变量。
auto只能修饰内部变量,不能修饰外部变量。也就是说只有内部变量可以定义为自动型变量,外部变量不能定义为自动型变量。
事实上,auto没有什么实际用处。内部变量已经默认为自动型变量。
2.静态型变量
外部变量和内部变量都可以定义为静态型变量。
如果在定义一个内部变量时,在定义语句最前面加上static存储类型限定词,那么该变量将是一个静态型变量。该变量将在静态数据区分配存储空间。这种变量作用域虽然只在函数内部,但是该变量将一直在静态数据区占据存储空间,直到程序运行结束。
定义外部变量时,如果不加存储类型限定词,它将在静态数据区分配存储空间。它的作用域除了本文件以外,其他文件通过extern语句声明后也可访问。
但是,如果在定义一个外部变量时,加上static限定词,其作用域将变窄,该变量只在本文件中可见,在其他文件中将不可见,此时在其他文件中即使用extern声明也不能扩展其作用域。这是一个外部静态型变量,也在静态数据区分配存储空间。
注意:对于函数的作用域也是这样,如果在函数定义时加上了static限定词,那么该函数也只在其定义文件内可见(“可见”的意思就是在在该范围内可以使用)。在其他文件中即使声明了也不可以调用。另外,对于函数声明而言可以省略extern关键字。
一个文件中加了static的同名外部变量将隐藏其他文件中定义的未加static的外部变量。也就是说,static变量能够屏蔽其他文件中的同名外部变量,这功能有点像函数的内部变量能够屏蔽同名的外部变量一样。但是,不同文件中如具有未加static的多个同名外部变量则是非法的。
static限定词常用于外部变量,也可用于函数。正常情况下,函数名字是全局的,对程序的任何部分都是可见的。如果在定义一个函数时用static限定,该函数将在其定义文件以外不可见。
static限定词同样能够应用于内部变量。此时,该变量将是一个内部静态型变量。内部静态型变量就像自动变量一样是属于某个特定函数的内部变量。但是,同自动型变量不同,它们一直在内存中存在,而不是随着函数的每次调用而存在,随着函数调用结束而消失。这意味着内部静态型变量提供了单个函数内部私有的、持久的存储。也就是说内部静态型变量只在函数被调用时起作用,但是它将在程序的整个运行时间内一直占据内存空间。
3.寄存器型变量
register限定词通知编译器--程序中的变量将频繁使用。它的意思是建议编译器将程序中用register限定的变量放置在计算机的内部寄存其中,这样可能得到更小更快的程序。但是,编译器将根据实际情况考虑是否采纳该建议--是否将register变量处理为寄存器变量最终决定权还是在编译器。
如下使用register:
register int x;/*x必须是内部变量*/
register char ch;/*ch必须是内部变量*/
register只能用于限定自动型变量和函数的形式参数。也就是说register只对内部变量起作用,而且只能限定内部非静态型变量,不能限定内部静态型变量。
register也可以应用于形式参数,格式如下:
f(register unsigned m,register long n) /*register应用于形式参数*/
{
register int i; /* register应用于内部变量*/
}
在传统C中,register变量的使用有诸多限制,它决定于硬件的实现方式。在每一个函数中只有少数几个变量可以保存在寄存器中,而且也只有特定的类型才行。过量的register变量看起来是无害的,但是超量以后,编译器将忽略新的register变量。另外不管register变量实际上是否被编译器设置为寄存器型变量,都不可能取得该变量的地址。寄存器型变量的类型和数量的多少随计算机不同而异。register变量一般只能够设置几个。传统C的register类型限定于char、int等类型。像float、double、数组等是不可以设定为register型变量的。但是,在最新C99标准中,任何类型都可以定义为register变量,register声明的目的只是告诉编译器以尽快的速度处理该变量,编译器不见得非把它处理为register变量。
4.外部型变量
如extern用于变量定义语句前面,那么该语句就只能是一个声明语句了,他不再是一个变量定义语句。它仅仅是一个声明--声明该变量已经在别的地方定义,只是告诉编译器该变量的类型。
extern int sp;/* sp在别的地方定义,并分配存储单元,本语句只是声明它已经定义过*/
该语句声明了sp在别的地方已经定义,并分配了存储空间,本语句只是说明sp已经定义过的类型为int,并不再为它分配内存空间。这样声明以后,在本文件余下部分就可以使用sp了。
❾ 存储器的类型
根据存储材料的性能及使用方法的不同,存储器有几种不同的分类方法。1、按存储介质分类:半导体存储器:用半导体器件组成的存储器。磁表面存储器:用磁性材料做成的存储器。
下面我们就来了解一下存储器的相关知识。
存储器大体分为两大类,一类是掉电后存储信息就会丢失,另一类是掉电后存储信息依然保留,前者专业术语称之为“易失性存储器”,后者称之为“非易失性存储器”。
1 RAM
易失性存储器的代表就是RAM(随机存储器),RAM又分SRAM(静态随机存储器)和DRAM(动态随机存储器)。
SRAM
SRAM保存数据是靠晶体管锁存的,SRAM的工艺复杂,生产成本高,但SRAM速度较快,所以一般被用作Cashe,作为CPU和内存之间通信的桥梁,例如处理器中的一级缓存L1 Cashe, 二级缓存L2 Cashe,由于工艺特点,SRAM的集成度不是很高,所以一般都做不大,所以缓存一般也都比较小。
DRAM
DRAM(动态随机存储器)保存数据靠电容充电来维持,DRAM的应用比SRAM更普遍,电脑里面用的内存条就是DRAM,随着技术的发展DRAM又发展为SDRAM(同步动态随机存储器)DDR SDRAM(双倍速率同步动态随机存储器),SDRAM只在时钟的上升沿表示一个数据,而DDR SDRAM能在上升沿和下降沿都表示一个数据。
DDR又发展为DDR2,DDR3,DDR4,在此基础上为了适应移动设备低功耗的要求,又发展出LPDDR(Low Power Double Data Rate SDRAM),对应DDR技术的发展分别又有了LPDDR2, LPDDR3, LPDDR4。
目前手机中运行内存应用最多的就是 LPDDR3和LPDDR4,主流配置为3G或4G容量,如果达到6G或以上,就属于高端产品。
2 ROM
ROM(Read Only Memory)在以前就指的是只读存储器,这种存储器只能读取它里面的数据无法向里面写数据。所以这种存储器就是厂家造好了写入数据,后面不能再次修改,常见的应用就是电脑里的BIOS。
后来,随着技术的发展,ROM也可以写数据,但是名字保留了下来。
ROM中比较常见的是EPROM和EEPROM。
EPROM
EPROM(Easerable Programable ROM)是一种具有可擦除功能,擦除后即可进行再编程的ROM内存,写入前必须先把里面的内容用紫外线照射IC上的透明视窗的方式来清除掉。这一类芯片比较容易识别,其封装中包含有“石英玻璃窗”,一个编程后的EPROM芯片的“玻璃窗”一般使用黑色不干胶纸盖住, 以防止遭到紫外线照射。
EPROM (Easerable Programable ROM)
EPROM存储器就可以多次擦除然后多次写入了。但是要在特定环境紫外线下擦除,所以这种存储器也不方便写入。
EEPROM
EEPROM(Eelectrically Easerable Programable ROM),电可擦除ROM,现在使用的比较多,因为只要有电就可擦除数据,再重新写入数据,在使用的时候可频繁地反复编程。
FLASH
FLASH ROM也是一种可以反复写入和读取的存储器,也叫闪存,FLASH是EEPROM的变种,与EEPROM不同的是,EEPROM能在字节水平上进行删除和重写而不是整个芯片擦写,而FLASH的大部分芯片需要块擦除。和EEPROM相比,FLASH的存储容量更大。
FLASH目前应用非常广泛,U盘、CF卡、SM卡、SD/MMC卡、记忆棒、XD卡、MS卡、TF卡等等都属于FLASH,SSD固态硬盘也属于FLASH。
NOR FLAHS & NAND FLASH
Flash又分为Nor Flash和Nand Flash。
Intel于1988年首先开发出Nor Flash 技术,彻底改变了原先由EPROM和EEPROM一统天下的局面;随后,1989年,东芝公司发表了Nand Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。
Nor Flash与Nand Flash不同,Nor Flash更像内存,有独立的地址线和数据线,但价格比较贵,容量比较小;而Nand Flash更像硬盘,地址线和数据线是共用的I/O线,类似硬盘的所有信息都通过一条硬盘线传送一样,而且Nand Flash与Nor Flash相比,成本要低一些,而容量大得多。
如果闪存只是用来存储少量的代码,这时Nor Flash更适合一些。而Nand Flash则是大量数据存储的理想解决方案。
因此,Nor Flash型闪存比较适合频繁随机读写的场合,通常用于存储程序代码并直接在闪存内运行,Nand Flash型闪存主要用来存储资料,我们常用的闪存产品,如U盘、存储卡都是用Nand Flash型闪存。
在Nor Flash上运行代码不需要任何的软件支持,在Nand Flash上进行同样操作时,通常需要驱动程序。
目前手机中的机身内存容量都比较大,主流配置已经有32G~128G存储空间,用的通常就是Nand Flash,另外手机的外置扩展存储卡也是Nand Flash。
❿ 什么是结构化的数据存储类型
在C语言中, 有 数据类型(data type) 和 数据存储类(data storage class) 2个术语
数据类型一般用于表示 某个变量它在内存中占据的字节数。
举例, char ch = ‘a’; 定义了一个字符变量ch, 初始化为字符a,数据类型为char的变量在内存中一般占据 一个字节的内存空间,直接和它对应的一个函数为 sizeof(), 这个函数可以求出具体某个平台上,某种数据类型占据的内存字节数。再举例int数据类型, int这个数据类型的大小,一般而言与处理器中寄存器的大小是一致的, 对于不同的平台,16位,32位,64位 都是可能的,也就是2个字节,4个字节,8个字节等
以上说的是数据类型
关于存储类(storage class) 有4种,分别是 auto, static, extern, register
auto 是默认的存储类型,也就是说你声明一个变量,如 int i; 等同于 auto int i; 对于一个程序员而言,auto没多大用途,对于一个编译器设计者,就是另外一回事了。
static 声明了静态数据,所谓静态数据 也就是变量的生命期(lifetime),通俗点讲,就是它能起多久的作用(如果我没说错的话), 这种存储类型的变量 是和 你的程序共存亡的,
如定义 static int count = 10; 除非你改变了它,或者程序退出了,否则它是一直存在的
extern 这个存储类型, 一般是声明变量,或者函数的,它告诉编译器,某某的定义在别处,
比如
// in source code a.c
extern int p(unsigned i);
在这个程序的别的源代码文件中存在 这个函数p的定义,
如
// in source code b.c
int p(unsigned i)
{
if(i>0)
return 1;
else
return 0;
}
regiter 这个存储类告诉编译器 尽量把某变量安排在寄存器里边,这是程序员处于对该变量访问速度的考虑,现在能看见这样的声明的机会不是很多了, 也有, 因为如果声明了register 就打乱了编译器本身的优化策略,但是,再说一次,有人还是在做这样的使用的
希望我以上说的能对你有所帮助,哪怕一点点帮助也好