一、C++语法基础(浅谈)

一、计算机基础知识(简述内存)

1. 32位、64位处理器

32位和64位是指 :CPU一次处理数据的能力是32位还是64位,是计算机CPU中通用寄存器一次性处理、传输、暂时存储的信息的最大长度。即CPU在单位时间内(同一时间)能一次处理的二进制数的位数不能将数据总线与地址总线的宽度与cpu位数当作一致。

2.CPU读取内存数据

一个程序以二进制形态存入于外存,当运行程序,会由外存转入内存,CPU会通过某种方式获得其程序第一条指令的首地址,通过CPU寄存器偏移读取分析一条条指令,通过一条指令先得到操作码(告诉cpu这条指令做什么),在得到地址码(告诉CPU到存储单元地址去取数据)。CPU首先通过控制总线告诉内存这个数据是读还是写,然后通过地址总线告诉内存所要获取数据的地址,最后通过数据总线获取数据。

数据总线
a.是CPU与内存或其他器件之间的数据传送的通道。
b.数据总线的宽度决定了CPU和外界的数据传送速度。
c.每条传输线一次只能传输1位二进制数据。8根数据线一次可传送一个8位二进制数据(即一个字节)。
d.数据总线的宽度,决定有多少的内存可以被访问。

数据总线是双向三态形式的总线。数据的含义是广义的,它可以是真正的数据,也可以指令代码或状态信息,有时甚至是一个控制信息,因此,在实际工作中,数据总线上传送的并不一定仅仅是真正意义上的数据。

地址总线
a.CPU是通过地址总线来指定存储单元的。
b.地址总线决定了cpu所能访问的最大内存空间的大小。10根地址线能访问的最大的内存为(1KB)。
c.地址总线的宽度,决定有多少的内存可以被存取。

控制总线
a.决定了CPU对其他控件的控制能力以及控制方式。
由此可见在计算机的世界里万物皆数字——进制

3.关于指针所占内存大小

一个指针在64位地址总线的计算机上,占8个字节;
(0xFF FF FF FF FF FF FF FF)
一个指针在32位地址总线的计算机上,占4个字节。
(0xFF FF FF FF)

假如,某计算机的地址总线是32位,0和1的不同组合可通过32位传输,即CPU能访问最大内存为2^32个存储单元(4GB),CPU最大寻址范围为2^32,也就是4个字节的大小,因此,我们只需要4个字节就可以找到所有的数据。同理,在64位地址总线的计算机中,指针占8个字节。

4.计算机存储器

计算机存储器分为两大类:内存存储器(随机存取存储器或内存条)和外部存储器(外存)。

内存储器(内存条):暂时存储进程以及数据的地方,又称主存,是CPU能直接寻址的存储空间。特点是内存容量小,存取速度快,读写反应速度快。只能临时保存信息(经cup处理后的数据),断电后信息就会消失,这就需要另一种存储器——外存储器。

外存储器:外存容量大,存取速度比内存慢,能永久保存信息,断电后信息不会消失。它好比是数据的外部仓库一样,相当于有了记忆功能,外存主要是磁盘。

内存是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。计算机中所有程序的运行都是在内存中进行的,内存的运行决定了计算机的稳定运行, 因此内存的性能对计算机的影响非常大.

外存通常是磁性介质或光盘,像硬盘,软盘,磁带,CD等,能长期保存信息,并且不依赖于电来保存信息,但是由机械部件带动,速度与CPU相比就显得慢的多。

如果你的电脑没有安装内存条,那电脑是不会显示界面的,但如果你的电脑没有安装硬盘的话,电脑还是会显示英文界面的,但根本无法进入操作系统。

5.编码规范

ANSI
ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x00-0x7F 范围的1 个字节来表示 1 个英文字符。超出此范围的使用0x80-0xFFFF来编码,即扩展的ASCII编码

不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5(繁体中文)、Shift_JIS(日本) 等各自的编码标准。在简体中文的windows系统上打开记事本输入文字字符,其格式默认就是ANSI即GB2312

Unicode——万国码
但对于不同字符系统而言,就要经过字符码转换,非常麻烦,如中英、中日、日韩混合的情况。为解决这一问题,国际组织制定了可以容纳世界上所有文字和符号的字符编码方案Unicode。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。

Unicode 编码方式
以汉字“汉”为例,它的 Unicode 码点是 0x6c49,对应的二进制数是110110001001001,二进制数有 15 位,这也就说明了它至少需要 2 个字节来表示。可以想象,在 Unicode 字典中往后的字符可能就需要 3 个字节或者 4 个字节,甚至更多字节来表示了。

这就导致了一些问题,计算机怎么知道你这个 2 个字节表示的是一个字符,而不是分别表示两个字符呢?
于是,为了较好的解决 Unicode 的编码问题, UTF-8 和 UTF-16 两种当前比较流行的编码方式诞生了。

UTF-8
UTF-8 是目前互联网上使用最广泛的一种 Unicode 编码方式,它的最大特点就是可变长。它可以使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度。
解码的过程也十分简单:如果一个字节的第一位是 0 ,则说明这个字节对应一个字符;如果一个字节的第一位1,那么连续有多少个 1,就表示该字符占用多少个字节。

UTF-16
Unicode 是一本很厚的字典这么多的字符不是一次性定义的,而是分区定义。每个区可以存放 65536 个字符。称为基本平面。他的码点范围写成 16 进制就是从 U+0000 到 U+FFFF。所有最常见的字符都放在这个平面。

剩下的字符都放在辅助平面,码点范围从 U+010000 到 U+10FFFF。

UTF-16 编码结合了定长和变长两种编码方法的特点。它的编码规则很简单:基本平面的字符占用 2 个字节,辅助平面的字符占用 4 个字节。也就是说,UTF-16 的编码长度要么是 2 个字节,要么是 4 个字节。

UTF-32
当然还有一个 UTF-32 的编码方式,定长编码,字符统一使用 4 个字节,这样确实可以解决编码问题,但是却造成了空间的极大浪费,如果是一个英文文档,那文件大小就大出了 3 倍,这显然是无法接受的。

二、关于基本数据类型取值范围的计算

计算机存储数据按照补码方式来存。

原码:最高位为符号位(0表示正,1表示负)。
反码:正数=原码 负数:除符号位按位取反
补码:正数=原码 负数:反码+1

为什么计算机用补码存数据?

原码中0的表示有正负之分:
[+0]原 = 0000 0000 0000 0000;
[-0]原 = 1000 0000 0000 0000。
所以二进制原码表示时,范围是 -32767 ~ -0和0~32767,有两个0。

而计算机采用而补码存储数据0的表示是唯一的:
[+0] 补= [-0] 补= 0000 0000 0000 0000
负数表示需依照补码规则,即-32767的补码为1000 0000 0000 0001。

所以补码中会比原码多一个编码出来,这个编码就是1000 0000 0000 0000,因为任何一个原码都不可能在转化成补码时变成1000 0000 0000 0000,所以人们规定1000 0000 0000 0000这个补码编码为-32768。

结论:
short型数据占两个字节,即该short型数据取值范围为-32768 ~ 32767。

三、关于二维数组偏移

首先,定义一个二维数组int Array[y][x];

对于二维数组的指针偏移的运算法则。同一维数组一样,二维数组的数组名也是指向第一个数组元素的(即Array等于&Array[0][0]),且二维数组的数组元素在计算机内的内存存放也是连续的,但不一样的是:Array+1的值不是&Array[0][1],而是&Array[1][0](即对于二维数组 Array[y][x],指针Array+1中的1表示的字节数是sizeof(int)*x)。

但是注意,同一、二维数组名一样,虽然Array+1的值等于第二行第一个元素的地址,但是使用指针运算符引用 *(Array+1)得到值依然只是一个地址。
相关代码:

    int arr[5][6] = 
                {
    1, 2, 3, 4, 5, 6,
                  7,8, 9, 10,11,12,
                  13,14,15,16,17,18,
                  19,20,21,22,23,24,
                  25,26,27,28,29,30 };
    printf("*(*(arr+4)+2)=%d\n", *
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值