注册 登录
编程论坛 C语言论坛

关于简单的递归问题

Remained 发布于 2022-02-22 18:14, 1433 次点击
程序代码:
#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修饰的变量
6 回复
#2
rjsp2022-02-22 20:56
不知道要解释什么,


    scanf("%d",&num);
    print(num);
之间加一句
    printf( "%d\n", num );
你可以看到程序接受了什么值
#3
Remained2022-02-23 10:01
回复 2楼 rjsp
修改后我尝试了下, 我输入了2147483648(2的^32次方)  printf可以打印 但是函数 只能返回一个-8  不太懂为什么会这样
#4
不会游泳的虾2022-02-23 10:13
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,依次类推。
#5
rjsp2022-02-23 10:25
你能不能把现象描述清楚?比如
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 ?
#6
Remained2022-02-23 18:07
回复 5楼 rjsp
想问的问题是后者,刚看4楼做了解释,已经搞明白了 谢谢大哥耐心回复
#7
Remained2022-02-23 18:08
回复 4楼 不会游泳的虾
懂了! 感谢!
1