高考开始了,同学们你们知道C语言整形在内存里面的存储方式吗。

许多学习了很久的同学都没有学习到c语言应该学习到到知识,那就是与内存相关的知识。

下面我会说一下整形在电脑里面的存储方式。

计算机所有的指令执行都是由电路完成,而电路可以表示都只有电没电。那计算机怎么运算出我们常用的数字题目呢?

我们使用的是10进制,而计算机使用的是2进制。十进制顾名思义就是逢十进一,二进制那么就是逢二进一.

我们使用的数字,9再加一就是10了,就是二位数了。 

二进制里面没有二,二就是10。  逢二进一这个概念很容易理解。

除此之外还有八进制 十六进制。

关于进制之间的转换 我这里不多说,百度都可以找到。

这里提前说一下原码,反码,补码的概念,下面会做介绍,

整型一般都是4个字节  每个字节有4个位(一个为就是一个二进制0或者1)一共就是 4*4个位。

下面假如数字6,那么它的二进制就是0000 0000 0000 0110  你以为到这里就完了?不;

那么假如是负数呢?-6,这里会让这一串二进制的最高位当符号位,告诉你这个是正数还是负数,比如-6变成二进制就是1000 0000 0000 0110(1为负,0为正)这便是原码,又十进制直接转换过来的。

这时如果我们在计算机内直接使用原码进行计算,一个题目

比如6-18,6-18也就等于6+(-18)

[0000 0000 0000 0110]原 + [1000 0000 0001 0010]原

= [1000 0000 0001 1000]原

= -24

6-18=-24???

于是后来人们想出了反码,

就是把负数的原码每个位都取反,运算结束再变回原码。

问题是出在负数上面的,所以只需要负数取反,而正数的反码和原码相等。

6 - 18 = 6 + (-18)

= [0000 0000 0000 0110]反 + [1111 1111 1110 1101]反

= [1111 1111 1111 0011]反

= [1000 0000 0000 1100]原

= -12

这个时候是不是结果就是正确的了?但是你以为就结束了吗? 让我们再算一下18-6.

[0000 0000 0001 0010]反 + [1111 1111 1111 1001]反

= [10000 0000 0000 1011]反(这里变成17个位了,因为数据溢出了,由于内存只给了它4个字节存储不了只好丢掉了)

= [0000 0000 0000 1011]反

= [0000 0000 0000 1011]原

= 11

这时运算的结果和正确结果并不一致,所以就有补码,(补码是再反码的基础上再加一.)

同样正数不需要变化。

这时我们再试试18 - 6

= [0000 0000 0001 0010]补 + [1111 1111 1111 1010]补

= [10000 0000 0000 1100]补

= [0000 0000 0000 1100]补

= [0000 0000 0000 1100]反

= [0000 0000 0000 1100]原

= 12

正确了是不是很神奇,下面总结一下 内存里整形都是以补码的形式存数,正数的原码反码补码都相等,负数的需要按位取反再加一变成补码。

也差不多讲完了,这里祝你们考试顺利,假如还有什么不了解的可以关注我,然后私信问我。许多学习了很久的同学都没有学习到c语言应该学习到到知识,那就是与内存相关的知识。

下面我会说一下整形在电脑里面的存储方式。

计算机所有的指令执行都是由电路完成,而电路可以表示都只有电没电。那计算机怎么运算出我们常用的数字题目呢?

我们使用的是10进制,而计算机使用的是2进制。十进制顾名思义就是逢十进一,二进制那么就是逢二进一.

我们使用的数字,9再加一就是10了,就是二位数了。 

二进制里面没有二,二就是10。  逢二进一这个概念很容易理解。

除此之外还有八进制 十六进制。

关于进制之间的转换 我这里不多说,百度都可以找到。

这里提前说一下原码,反码,补码的概念,下面会做介绍,

整型一般都是4个字节  每个字节有4个位(一个为就是一个二进制0或者1)一共就是 4*4个位。

下面假如数字6,那么它的二进制就是0000 0000 0000 0110  你以为到这里就完了?不;

那么假如是负数呢?-6,这里会让这一串二进制的最高位当符号位,告诉你这个是正数还是负数,比如-6变成二进制就是1000 0000 0000 0110(1为负,0为正)这便是原码,又十进制直接转换过来的。

这时如果我们在计算机内直接使用原码进行计算,一个题目

比如6-18,6-18也就等于6+(-18)

[0000 0000 0000 0110]原 + [1000 0000 0001 0010]原

= [1000 0000 0001 1000]原

= -24

6-18=-24???

于是后来人们想出了反码,

就是把负数的原码每个位都取反,运算结束再变回原码。

问题是出在负数上面的,所以只需要负数取反,而正数的反码和原码相等。

6 - 18 = 6 + (-18)

= [0000 0000 0000 0110]反 + [1111 1111 1110 1101]反

= [1111 1111 1111 0011]反

= [1000 0000 0000 1100]原

= -12

这个时候是不是结果就是正确的了?但是你以为就结束了吗? 让我们再算一下18-6.

[0000 0000 0001 0010]反 + [1111 1111 1111 1001]反

= [10000 0000 0000 1011]反(这里变成17个位了,因为数据溢出了,由于内存只给了它4个字节存储不了只好丢掉了)

= [0000 0000 0000 1011]反

= [0000 0000 0000 1011]原

= 11

这时运算的结果和正确结果并不一致,所以就有补码,(补码是再反码的基础上再加一.)

同样正数不需要变化。

这时我们再试试18 - 6

= [0000 0000 0001 0010]补 + [1111 1111 1111 1010]补

= [10000 0000 0000 1100]补

= [0000 0000 0000 1100]补

= [0000 0000 0000 1100]反

= [0000 0000 0000 1100]原

= 12

正确了是不是很神奇,下面总结一下 内存里整形都是以补码的形式存数,正数的原码反码补码都相等,负数的需要按位取反再加一变成补码。

也差不多讲完了,这里祝你们考试顺利,假如还有什么不了解的可以关注我,然后私信问我。

你可能感兴趣的:(高考开始了,同学们你们知道C语言整形在内存里面的存储方式吗。)