本文共 1775 字,大约阅读时间需要 5 分钟。
计算机使用8位的块,或者字节(byte),作为最小的可寻址内存单位。机器级程序将内存视为非常大的字节数组,称为虚拟内存
,内存的内一个字节都由唯一数字标识,称为它的地址
,所有可能的地址集合称为虚拟地址空间
。
顾名思义,这个虚拟地址空间只是展现给机器程序的概念性映像,实际的实现是将动态随机访问存储器、闪存、磁盘存储器、操作系统软件结合起来,为程序提供一个看上去统一的字节数组。
十六进制表示法:
计算机都有一个字长,指明指针数据的标称大小(normal size),虚拟地址是以这样的一个字编码的,字长决定的参数就是虚拟地址空间的大小,对于字长为w位的机器而言,虚拟地址范围2~2^w-1
,程序最多访问2^w
个字节
C语言各种数据类型分配的字节数:
跨越多字节的程序对象,必须建立两个规则:
多字节对象几乎都被存储为连续的字节序列,对象地址为使用字节中最小的地址。例如,一个类型为int
的变量x
地址为0x100
,也就是地址表达式 &x
为0x100
, 那么(假设int为32位表示)x
的4个字节将被存储在内存的0x100
,0x101
,0x102
,0x103
位置
排列表示一个对象的字节有两个通用的规则,在内存中按照从最低有效字节到最高有效字节的顺序存储–最低有效字节在前的方式成为小端法
,按照从最高有效字节到最低有效字节存储–最高有效字节在前的方式成为大端法
x
类型为int
,位与地址0x100
,它的十六进制值为0x1234567
C字符串被编码为一个以NULL
(值为0)字符结尾的字符数组,每个字符由某个标准编码表示,最常见ASCII码。使用ASCII码作为字符码的任何系统都将得到相同的结果,与字节顺序和字大小规则无关
CPU能读懂的最小单位 —— 比特位,bit,b,即 0 1 两个数字;内存机构的最小寻址单位 —— 字节,Byte,B。如下图所示,为字节和比特之间的关系
计算机是用补码的形式来存放整数的值,其中正数的补码是该数的二进制形式,而负数的补码需要通过以下几步获得:为什么c语言中
short
的表示范围是-32768~32767
这得从二进制的原码说起,如果以最高位为符号位,二进制原码最大为0111111111111111
=215-1=32767,最小为1111111111111111
=-(215-1)=-32767。此时0有两种表示方法,即正0和负0:0000000000000000
=1000000000000000
=0
,所以,二进制原码表示时,范围是-32767~-0
和0~32767
,因为有两个零的存在,所以不同的数值个数一共只有216-1个,比16位二进制能够提供的216个编码少1个
计算机中采用二进制补码存储数据,即正数编码不变,从0000000000000000
到0111111111111111
依旧表示0到32767,而负数需要把除符号位以后的部分取反加1,即-32767的补码为1000000000000001
,到此,再来看原码的正0和负0:0000000000000000
和1000000000000000
,补码表示中,前者的补码还是0000000000000000
,后者经过非符号位取反加1后,同样变成了0000000000000000
,也就是正0和负0在补码系统中的编码是一样的。
但是我们知道16位二进制数可以表示216个编码,而在补码中零的编码只有一个,也就是在补码中会比原码多一个编码出来,这个编码就是1000000000000000
,因为任何一个原码都不可能在转化为补码时变成1000000000000000
,所以,人为规定1000000000000000
这个补码编码为-32768。因此补码系统中,short范围为-32768~32767
。
实际上,二进制最小数确实是
1111111111111111
,只是二进制补码的最小值才是100000000000000
,而补码的1111111111111111
是二进制的-1
一个字节有符号取值范围:
【完】?
转载地址:http://tyhpi.baihongyu.com/