标题:关于简单的递归问题
只看楼主
Remained
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2022-2-21
结帖率:100%
已结贴  问题点数:15 回复次数:6 
关于简单的递归问题
程序代码:
#include<stdio.h>
void print(int n)//
{
    if(n>9)
    {
        print(n/10); 
    }
    printf("%d、",n%10);
}
int main()
{

//函数 逐个打印 
    int num = 0;
    printf("请随意输入一个数字,我将会逐个打印它\n"); //当我输入0到(2^31-1)时都可以正常打印,但输入2^32打印出-8 ;
                                                      //2^32+1打印出-7;2^32+2打印出-6依次类推 到2^32次方+8 打印出0                                           
    scanf("%d",&num);                                 //2^32次方+9 打印出-9;2^32次方+10 打印出 -8
    print(num);                                       //我的推测是一个整形变量存储的数字大小上限,但是为什么会循环?求个大神解答下这种现象的原因
    
    return 0; 

} 
//拓展____ 
//堆区  :动态开辟的内存 malloc calloc 
//静态区:全局变量 static修饰的变量 
搜索更多相关主题的帖子: 打印 num 递归 输入 int 
2022-02-22 18:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
不知道要解释什么,


    scanf("%d",&num);
    print(num);
之间加一句
    printf( "%d\n", num );
你可以看到程序接受了什么值
2022-02-22 20:56
Remained
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2022-2-21
得分:0 
回复 2楼 rjsp
修改后我尝试了下, 我输入了2147483648(2的^32次方)  printf可以打印 但是函数 只能返回一个-8  不太懂为什么会这样
2022-02-23 10:01
不会游泳的虾
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:101
专家分:643
注 册:2021-7-1
得分:10 
int的取值范围是 - 2 ^ 31 - 2 ^ 31 - 1, 也就是 - 2147483648 - 2147483647
在计算机当中数据都是以01二进制形式存储的,而整型变量int占的是4个字节,一个字节8位,也就是32位。
所以一个整型变量在计算机当中其实可以用32位的二进制来表示。
正整数用原码表示,负整数用补码表示(正整数的原码和补码相同)。
正整数在内存中的32位最大可以表示为
0111 1111 | 1111 1111 | 1111 1111 | 1111 1111 也就是2 ^ 31 - 1 = 2147483647 因为是正整数,所以第一位符号位是0。
负的整型变量原码转化成补码,补码就是原码除符号位之外取反后加1,具体方法可以百度下。
正整数超出2147483647范围后出现了循环取值的现象,也就是2147483648溢出后回到了最小负整数 - 2147483648,
2147483649溢出后变成了 - 2147483648 + 1 = -2147483647,依次类推。
2022-02-23 10:13
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:5 
你能不能把现象描述清楚?比如
printf可以打印
你指的是哪个printf?为什么你之前会认为它有可能不可以打印?你原代码有两处printf,若加上我在2楼说的那句,那一共有3处printf。
只能返回一个-8
你的原代码中,有返回的只有main函数,而且是返回0,所以我都不知道你这句话的主语是谁。

我来问简单一些,编译如下代码
程序代码:
#include <stdio.h>

void print( int n )
{
    if( n > 9 )
        print( n/10 );
    printf( "%d、", n%10 );
}

int main( void )
{
    int num = 0;
    scanf( "%d", &num );
    printf( "%d\n", num );

    print(num);
}

然后运行时输入 2147483648 后,输出是什么?
应该有两行输出,设第一行输出是 a,第二行输出是 b,那么你想问的是为什么输入 2147483648 后,但第一行输出是 a ?还是为什么传给自定义函数print的参数是 a,但它输出的是却是 b ?
2022-02-23 10:25
Remained
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2022-2-21
得分:0 
回复 5楼 rjsp
想问的问题是后者,刚看4楼做了解释,已经搞明白了 谢谢大哥耐心回复
2022-02-23 18:07
Remained
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2022-2-21
得分:0 
回复 4楼 不会游泳的虾
懂了! 感谢!
2022-02-23 18:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-508402-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.287715 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved