打印
[示例代码]

C语言编程基础学习中数据的溢出

[复制链接]
1116|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
uytyu|  楼主 | 2022-10-28 16:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
C语言是面向过程的,而C++是面向对象的
C和C++的区别:
C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。
C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。
C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。


计算机中的一切文件都是以二进制补码的形式存在,问题也就来了。
第一个问题 如果我们给一个无符号的数赋值一个负数,他会读取到什么,又会输出什么?
首先来说编译器并不会报错,但是具体的内存操作就要和我们刚才说的有关系了,比如我们在存储一个负数
它会以 负数——转反码——转补码 存储到计算机中。


我们可以看上面的程序,在无符号的字符型里面我们给他赋值-1而输出是255。
为什么那?原因如下。在我们输入的-1的时候,计算机会将这个-1存储为负数的补码
也就是 源码: 1000 0001
反码:1111 1110
补码:1111 1111
特别说明:反码就是符号位不变,其他位取反。可能你会说,这还用你教,原因是作者本人当年在学源码 反码 补码的时候,生病了.
补码:是在反码的基础上加1.
好了。回到我们今天的主题。既然计算机会1111 1111 存储到计算机,那么读取的时候又是如何读取的那?
这就要注意了。我们是把一个负数存储到了无符号的变量里。计算机在输出的时候。一看要输出的变量类型是无符号类型
那么最高位计算机就会当成数据位。也就是255。
第二个问题是什么那?那就是溢出。我们知道char类型来说它的范围是-128~127
那么我们就想试试我给他个129,如何?
这次我们先来分析一下129存储到里面是什么样的。首先129是有符号的数。129是正数,正数的源码,反码,补码都是一样的。
1000 0001(源码 反码 补码)都一样哦!
好了我们把129也按补码存储到了内存,但是在读取的时候是什么样的那?读取的时候,由于是有符号的数据类型,最高位会当作符号位处理
那么最高位是1,就是代表负数。注意了,核心问题来了!
我们在读取的过程是存储过程的逆过程,我们在存储的时候 源码——》反码——》补码。在我们读取的时候 补码——》反码——》源码。(以前加1,现在减1变为反码)
当前我们最高位是1 计算机会当作负数处理,也就是在读取的时候要进行逆过程。
补码 1000 0001
反码 1000 0000
源码 1111 1111 (-127)





使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

2976

帖子

1

粉丝