C语言学习记录230629

        下午抽空把今天的课程上掉了,意外就结束掉了C语言的入门学习,除此以外就是今天又学到了不少有意思的新东西,可能这才是我想要的吧,不说废话,开始今天总结。

        (一)编程常见的错误

                这部分主要是衔接昨天的内容,相当于调试的总结部分。

                我们通常编写的BUG,有三种类型,第一种是编译型错误,顾名思义,就是编译的时候就出了错,这种错误是最容易看出来的,因为编译器会直接给出我们大致编译错误的位置,我们根据我们的经验,一般来说能较快解决掉这种问题。并且这种错误一般来说就是我们自己敲代码时候不注意产生的问题,比如括号少了,运算符漏了之类的。

                第二种类型叫做链接错误,我们知道我们在编译器里写的代码是C语言的源文件,在编程目标代码,也就是可执行程序前,还需要经过编译和链接,第一种类型就是在编译过程中,编译器发现的问题,与此同类,链接型错误也就是在链接过程中发现的错误,这种错误程序也会给出一个显著的提示,这个提示一般来说会提示我们使用了未定义的函数,这种情况常出现于我们写错了自己或者别人写的函数名字,或者我们忘记了定义函数或者声明函数原型。同样的,这种错误因为程序会给出错误提示,一般来说也是比较好解决的。

                上面两种错误说好解决是因为当前的学习阶段应用不了多么高深的东西,所以假如碰到上面两种问题,一般来说是比较好解决的。

                第三种错误类型叫做运行错误,这种是最麻烦的一种错误,因为这个BUG已经成功的逃过了编译和链接的检查,已经能运行了,但是运行出来的东西不是我们想要的结果,或者程序运行了一半就崩溃,这种情况,一般来说就是我们编写的程序在某些逻辑上有些错误,需要我们通过调试功能一步一步去找出这个错误在哪里。
                上面说到的三种错误,假如我们真碰到了,请不要质疑电脑,因为电脑在这些方面不会像我们人一样撒谎,有问题肯定就是我们的错误,所以请端正态度,仔细调试找出自己的错误并修正他。

        (二)数据类型

                其实数据类型,在最开始的C语言概览,以及后续的操作符总结过程中,已经学习了相当一部分的内容,这边依旧还是简单的说一下各种类型吧,C语言中数据类型大致为整型类型,浮点数类型,构造类型,指针类型以及空类型。

                构造类型有结构体类型、枚举类型以及联合类型,这次不讨论,指针此前刚刚讨论过,也不讨论;而空类型指的就是void,这个在我们的自定义函数中没有返回值的时候倒是非常常见。

                主要还是仔细说在整型类型和浮点类型,整型类型从数值范围从下往上可以依次排列分为:short int、unsigned short int、int、unsignedint、long int、unsigned long int、long long int、unsigned long long int以及字符类型,这里的unsigned表示的是这个数值类型有没有符号,也就是无符号整型,这将影响这个数据类型在内存内存储时,是否会挪用一位用做符号位,无符号整型内存里是没有符号位的,所有位数都是数据位。那很多整型前面没有写unsigned,这时候就是默认表示为有符号,即有符号整型。char类型的数据,当前面不注明signed还是unsigned的时候,到底默认有没有符号,这个是看编译器的,换句话说也就是按定义实现的。

        (三)整型在内存中的存储

                整型在内存中的以什么形态存储的呢?直接给出答案,是以补码形式存在的,那么为什么要以补码形式存在呢?补码又是什么呢?接下来简单说一下。

                首先我们要知道我们日常生活中见到的数字实际上是10进制的,而计算机中,一般有二进制,八进制,十进制和十六进制,在内存中,这些数据以二进制存在,比如我们要在内存中保存一个正整数10,并且以int(4个字节)类型保存,一个字节是8位,那么这个整数在内存中的二进制数就是00000000000000000000000000001010,这个二进制数就是整数10的原码。原码就是十进制数转化的对应二进制数。

                那么反码是什么呢?我们知道整数分正负,若为有符号整型,最左侧的那一个二进制位就是符号位,用于表示数值的正负,1表示负,0表示正。刚刚的整数若为-10,那么他对应的二进制原码就是10000000000000000000000000001010。

                原码转化为反码的规则就是所有二进制位对应取反(1变为0,0变为1),但是假如为有符号整型,那么符号位不变,其他二进制位对应取反。这里还有一条规则,就是正数的反码跟原码一致,所以10的反码也为00000000000000000000000000001010,而-10的反码则为11111111111111111111111111110101。

                最后一步就是将反码变为补码,规则也很简单,正数的补码跟反码也一样,所以正数其实只要求出原码就可以直接知道反码和补码;负数则稍微再复杂一点,负数的补码为反码+1。综上所述,10和-10的原码、反码、补码如下:

10
原码:00000000000000000000000000001010
反码:00000000000000000000000000001010
补码:00000000000000000000000000001010

-10
原码:10000000000000000000000000001010
反码:11111111111111111111111111110101
补码:11111111111111111111111111110110

                那么我们计算机里储存数为什么要采用补码而不采用原码呢?明明原码转换一下就能直接计算。其实原因在于我们的CPU只有加法器,通俗点,它只会加法计算,不会减法计算。那么碰到减法是如何处理的呢?实际上CPU是将减法转化为了加法,比如1-1,CPU将之变为了1+(-1)去进行计算,那么假如内存中存的是原码,我们试图用原码去进行这一计算会怎样呢?

                结果如下:

1
原码:00000000000000000000000000000001
反码:00000000000000000000000000000001
补码:00000000000000000000000000000001

-1
原码:10000000000000000000000000000001
反码:11111111111111111111111111111110
补码:11111111111111111111111111111111

原码计算
1   :00000000000000000000000000000001
-1  :10000000000000000000000000000001
结果:10000000000000000000000000000010

                不难得出,我们会发现用原码计算得出的结果是-2,并不是我们想要的是0,所以可以知道当直接用原码去进行计算时,无法正常实现我们的要求。那么如何解决这个问题呢?科学家就想出了一个办法,也就是补码,当1和-1的补码进行这样的计算时,就能得出正确的答案,同时系统内原码和补码的转化过程是一样的,也不需要额外增加电路,因而内存里,整型数据是以补码形式保存的,刚刚的计算,若采用补码计算,结果如下:

 

补码计算
1   : 00000000000000000000000000000001
-1  : 11111111111111111111111111111111
结果:100000000000000000000000000000000

                最后会计算出17位二进制数,同时因为我们的int类型只保存16位二进制数,所以舍弃掉了最高位的1,最后结果就变成了16个0的二进制数,这个二进制数的结果也是0,跟我们想要的结果一致。到这里,是否会感叹计算机科学家的精妙设计!

                 最后再简单说一下内存里数据保存的顺序问题,因为我们内存单元是一个字节,而我们int类型或者其他数据类型往往由多个字节组成,这些数据在内存里如何排列这是一个问题,经过了那么多年的演化,最后出来了固定的两种排列方式,我们称之为大小端字节序。

                我们首先要清楚一个数据的高低位之分,假如有一个十六进制数0x1122,这里的0x11就是高字节位,而0x22就是低字节位,假如高字节位0x11存储在内存的低地址内存中,而低字节位0x22存储在内存的高地址内存中,这种排列方式我们称之为大端字节序。

                而小端字节序则与此相反高字节位0x11存储在高地址内存,而低字节位0x22存储在低地址内存内。

                今天就到此为止了,还有浮点类型的存储,这块就留着明天讲了,毕竟还没上过那部分的课,明天也不知道能不能正常写完博客,毕竟还要出差,总之加油吧~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值