永发信息网

C语言中8!这样算出来是怎么是负数?

答案:5  悬赏:30  手机版
解决时间 2021-03-28 12:32
  • 提问者网友:暗中人
  • 2021-03-27 15:41
C语言中8!这样算出来是怎么是负数?
最佳答案
  • 五星知识达人网友:平生事
  • 2021-03-27 17:20
c语言int数据类型的范围
在内存中分配2个字节 也就16位的二进制
-32768 ~~到~~32767
二进制数在计算机内存储的是其补码
对于有符号数,正数的补码和本身一样,负数的补码是本身的数字位取反后加1
比如:
1=(0001)补=(0001)
-1=(1001)补=(1111)
计算机存储-1就是存储的1111
因此
当int表示范围为16位时,可以表示的最大负数为:
10000...0000(后面有15个0)
相当于-0
但这其实是-32768=110000...0000(第一位符号位,后面有15个0)的补码表示
可以理解为16位的int足可以表示-32768的补码
当数值如8!>32767时会很自然的往高位进1,这时最高位为1
最高位为1,如前面所言,系统里识别是为负数。
当算到10!的时候继续进位,最高位为0,自又为正数了
但是无论你怎么算你得到的结果都永远不会大于32767
除非t改用float型,或者double型追问请教怎么改成float或者double型之后结果为0呢?追答你输出的时候是float型的输出么?%d改成%f追问呵呵,果然,受教了,谢谢老师哈……
全部回答
  • 1楼网友:拜訪者
  • 2021-03-27 20:34
运行出来是正常的啊。
  • 2楼网友:慢性怪人
  • 2021-03-27 19:02
while(i<=8)中 要求 i必须小于8
所以大于8就不行了
  • 3楼网友:患得患失的劫
  • 2021-03-27 18:51
我运行的没错啊!结果是40320. 9!也没错的。追问你是用的turbo还是visual?
  • 4楼网友:不想翻身的咸鱼
  • 2021-03-27 18:46
8!= 40320
如果用int 类型来存放阶乘的答案的话,由于它超过了16位整型数能表示的最大值32767,所以就发生了数据的“溢出”。所以答案就出错了。
这时,只要采用大一点的 long 类型(只是修改用来表示阶乘的变量的类型就可以了),就可以避免发生这样的问题。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯