C语言的一个程序运行的问题..为什么反显会出错.请大家赐教

2024-11-22 15:57:39
推荐回答(5个)
回答1:

程序很简单,输入数据,输出回车(\n),循环体是将输入的数据的最高位保存在数据空间j里。

对于程序本身没错,编译通过,当你输入数据时,程序对数据进行计算,输入的数据超出-32768~32767时,输入数据错误,也就是说,你输入的数是0~65535时就是正确的数据,再解释,从32767~65535系统认为其为负数,也是正确的数据。

在由就是为什么没有显示数据错误的提示,这也不难理解,首先对于数据空间j事实上是存放数据的地方,j在此后就没作他用(没有作为数据源参加判断或数据计算),所以即使是错误数据,系统没有必要显示。

回答2:

i是有符号整数,而且其长度sizeof(i)=2个字节(有些编译器是4个字节),我们以两个字节为例(也就是16位)
最大数值 01111111 11111111 (符号位为0表示整数)最大值也就是32767(可以根据等比数列求和公式得出),若你输入的32768也就是
01111111 11111111 + 00000000 00000001 = 10000000 0000000,由于符号位为1也就成了个负数了,当然编译器不会认为这个是错误,而我们根据实际情况判断其值是错误的,也就是我们成为的逻辑错误非编译错误。

关于计算机如何处理这类的错误,首先我提一下,Intel体系中,CPU体共乐一个8个字节的标志寄存器,其结构如下
位号 76543210
数值 xxxxxxxx
位0是进位标志(值0没有进位,值1为进位),位4是符号标志(0正号,1为负号),其他还有零标志,奇偶校验标志,中断标志,溢出标志,转移标志,超前进位标志等,这里不一一作介绍。
这个题我们用到的是位4符号标志,看一下一个二进制加法,结果造成了最高位(也就是符号位)置1了,那么其结果就是一个负数,系统自动将设置标志寄存器的符号位为1,由于你程序中没有对这个对这个标志的值进行判断(只有汇编能做到)进行错误处理,系统认为你这个运算结果是正确的,是个负数,不存在任何错误,也就无需处理。

回答3:

数据溢出,INT型数据是2个字节的,也就是说最大可以表示32768这个数,但是你在程序中没有设置范围,就会有数据溢出现象.也就是说一杯水的量是有限的,但是你要加入过量的水后,里面也会有水的,但就是的不到你想要的结果的.

我可以给你一给例子:
如:456789的二进制表示
8字节显示1101111100001010101
4字节1101111100001010101
2字节表示1111100001010101
单字节1010101
也就是说
要用单字节表示整数456789的二进制表示的是1010101十进制则是85即输出85
要用单字节表示整数987654的二进制表示的是110十进制则是6即输出6

要用双字节表示整数456789的二进制表示是1111100001010101十进制则是63573,即输出63573
要用双字节表示整数987654的二进制表示的是1001000000110十进制则是4614,即输出4614,这样就会将部分数据丢失,就不会输出想要的结果了.

回答4:

32768是2的15次方,大于32768也就是超过了16位INT类型所能表示的范围,虽然有结果,一定是错的。

回答5:

i\=10;是什么意思呢??
不是取整啊?程序是用来干什么的啊?
具体你是想知道运行过程还是知道int和无符号数的表示范围啊!
具体你还是查看课本中关于这部分就行了.