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

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

作者: 明江带你学c语言 | 来源:发表于2018-06-07 22:34 被阅读3次

许多学习了很久的同学都没有学习到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语言整形在内存里面的存储方式吗。

    许多学习了很久的同学都没有学习到c语言应该学习到到知识,那就是与内存相关的知识。 下面我会说一下整形在电脑里面的存...

  • C/C++字符串函数

    在C语言里如何存储字符串(C语言里没有String,C++里有)方式1:char c[] ={"z","h","a...

  • ARM汇编寻址方式详解

    寻址方式在C语言里面也可以称为一个内存操作,说到寻址方式,我们就会想哪里有地址,当然就是存储器,而存储器就包括内存...

  • C语言的内存布局

    C语言编程程序的内存如何布局 C语言程序连接过程中的特性和常见错误 C语言程序的运行方式 一:C语言程序的存储区域...

  • malloc、calloc、realloc的区别?

    (1)C语言跟内存分配方式<1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序...

  • Objective-C 内存管理基础

    前言 之前的两篇拙文C语言-内存管理基础、C语言-内存管理深入 介绍了关于C语言在内存管理方面的相关知识。但是对于...

  • 变量的静态存储与动态存储

    首先,静态存储与动态存储都是变量在内存中的存储方式。 C语言中变量分为局部变量(auto)、寄存器变量(regis...

  • C语言_内存和字符串

    @(C语言) [toc] 内存 c语言中内存分三个区: 程序区:存储程序的二进制文件 静态存储区:全局变量和静态变...

  • C 1. malloc、calloc、realloc的区别

    (1)C语言跟内存分配方式 <1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行...

  • C 静态内存、动态内存问题

    (1)C语言跟内存分配方式 <1>从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期...

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/tlwnsftx.html