关于计算机存储单位概述
大小
比特(bit)
简称 b
bit是表示信息的最小单位,是二bai进制数的一位包含的信息或2个选项中特别指定1个的需要信息量。
数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。
字节(byte)
简称B
Byte数据类型用一个字节储存,可区别256个数字,取值范围:0到255。 Byte是从0-255的无符号类型,所以不能表示负数.
1个字节能表示最大的值就是255, 所以很多时候我们见到有255最大的限制(例如ip地址)就是这个原因啊。
数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。
也就是说实际上普通的计算机系统是无法精确读取和定位到比特(bit)级的信息。
可以看成是有8个物理上连续的Bit组成的
8位(二进制数)bit(也叫比特)=1字节(byte)
千字节(kilobyte)kb
些人为了方便,就取第一个英文字。比如MB取M,KB取K,GB取G其实不太正确。你在电脑上就不会见到有M、K、G的只有MB、KB、GB。
1024b=1kb
其他
中文名 | 简称 | 英文单位 | 英文简称 | 进率 |
---|---|---|---|---|
位 | 比特 | bit | b | 0或1 |
字节 | 字节 | byte | B | 8位(1b*2^8) |
千字节 | 千字节 | KiloByte | KB | 1024B(1B*2^10) |
兆字节 | 兆 | MegaByte | MB | 1024B(1KB*2^10) |
吉字节 | 吉 | GlgaByte | GB | 1024B(1MB*2^10) |
太字节 | 太 | TeraByte | TB | 1024B(1GB*2^10) |
拍字节 | 拍 | PetaByte | PB | 1024B(1TB*2^10) |
艾字节 | 艾 | ExaByte | EB | 1024B(1PB*2^10) |
泽字节 | 泽 | ZettaByte | ZB | 1024B(1EB*2^10) |
尧字节 | 尧 | YottaByte | YB | 1024B(1ZB*2^10) |
二进制序列用以表示计算机、电子信息数据容量的量纲,基本单位为字节B,字节向上分别为KB、MB、GB、TB,每级为前一级的1024倍
操作系统
32位X86架构是指个人电脑的bai地址总线du是32位的,CPU、内存控制器、操作系统都是按32位地zhi址总dao线设计。
内存
内存作为1个存储数据的存在, 有1个很重要的特性, 就是内存里的数据能被cpu直接访问。
cpu能不能直接访问硬盘的数据呢, 不能。 只能通过把硬盘的数据先放到内存里, 然后再从内存里访问硬盘的数据。
内存里面放的也是0和1这俩个二进制数字,所以内存里实际上有海量的小格子,每1个格子是1个bit,就只能存放1个数字(0或者1), 那么数值255需要几个格子来放呢? 就是8个格子啊, 1个字节byte啊。
但是问题来了, 我刚说了内存里的格子数量非常巨大, 如果cpu要读出某个指定的数据, 怎么去找呢?学过数据结构的都找到,遍历虽然简单,但在海量数据面前效率非常低下
所以实际上是吧内存8个bit八个bit排成一组,每1组称为1个单位,大小事1byte(字节),cpu每一次只能访问一个bute,而不能去单独访问具体的一个小格子(bit)所以1个byte字节就是内存最小的io单位
其实大部分数据都会作为各种数据类型存放在内存中,二各种数据类型所占的字节大小也是不同的,例如c语言中char字符类型占一个字节(中文俩个字节)
java一个char是俩个字节(java默认的是unicode编码)
对于16位编译器,int站32位,int的最大值bai为32767.
对于32位和64位编译器,int占32位(4字节)。int的最大值为2147483647
以通过打印sizeof(int)查看平台对应的int占用字节数,乘8后即为位数。
即使我们把内存分成了以字节为单位的结构, 但是实际上内存里还是有非常多的字节的,例如64MB内存就有 64 × 1024 × 1024 个字节啊!
如果cpu要查找1个变量, 还是要1个个字节去找到话...还是1个很浪费时间的行为,所以为了避免去遍历内存,计算机系统就引入了内存地址这个概念。
计算机操作系统会给内存分配一个内存地址,cpu只需要知道某个数据类型的地址,就可以直接去到读影的内存位置上去提取数据了
为什么32位系统只有4g的内存
跟门牌号一样, 其实内存地址也是由1个2进制数字来表示的. 每1个地址对应内存里的1个byte字节, 如果地址的值加1, 那么这个地址就对应下1个字节了.
那么内存地址的长度是多少呢? 这个就是这篇文章标题所涉及的. 在32位操作系统中, 内存的地址就是32位的2进制数, 那么假如32位系统的某个内存地址是:
0000 1111 1111 0000 1111 0000 1111 0000
那么它可以用十六进制表示成: 0 F F 0 F 0 F 0
也就是 Ox0ff0f0f0 前面Ox代表十六进制, 所以你见到这种字母数字混合一次的地址方式,就是这样得来的了, 它实际上是1个二进制的数字啊. 不过计算机里面所有的东西都是二进制了..
上面说了, 既然32位系统里内存地址长度是32位的. 所以32位的地址范围就是从 0000 0000 0000 0000 0000 0000 0000 0000 到 1111 1111 1111 1111 1111 1111 1111 1111 啦(Ox00000000 ~ OxFFFFFFFF), 这里有几个地址呢? 明显是有 2^32 个啦.
4G 啊, 而每1个地址对应1个1个字节, 容量就是1byte, 所以2^32个地址就总共能对应应4GB 的内存容量啊, 这里的B指的是byte 字节啊。
假如你给32位的系统配上了8GB的内存, 操作系统最多也只能给其中4GB 分配地址, 其余 4GB 是没有地址, 因为地址不够用啊, 所以32位系统最多支持4GB内存就是这样来的。
那么为什么在茶油4gb内存条的计算机上win32系统只显示3.25g的内存空间呢
因为IO设备占用了0.75G的地址空间,所以windows32系统就只能识别3.25G的内存空间了
总结
32位指的是电脑可以由32位的地址线,那么一共可以识别的存储器数量,(包括内存和各种硬件的输入输出端口)一共是2的32次方,由于内存最小的存储单位是byte,所以综上所述,32位系统最多只能识别3G多一点内存.
指针
大家都知道指针是用来存放内存地址的,那么对于32位系统来讲,内存地址是1个32位长度的2进制数,而每一个内存单位长度只有1byte(8bit),所以一个指针就需要4byte的内存来存放该指针的内容(一个内存地址)
所以我们定义一个指针int *,然后sizeof(p)是返回4,
而对于64位系统来讲,内存是64位的2进制数,所以sizeof(p)就返回8了,共需要8个内存单位去存放 64位系统的1个指针.