这是检查给定号码是否为阿姆斯特朗号码的程序

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>

int main(int argc, char *argv[])
{
    int num,n,sum=0;
    num=atoi(argv[1]);
    if(argc==2 && num>0 && num<=INT_MAX)
    {   n=num;
        while(num>0)
        {
            sum+=(num%10)*(num%10)*(num%10);
            num/=10;
        }
        if(sum==n)
            printf("%d is an armstrong number",n);
        else
            printf("%d is not an armstrong number",n);
        return 0;
    }
    else
        return 1;
}


在这里我提供了输入

-12345678969

预期产量

命令以非零状态1退出

但它显示

539222919不是阿姆斯壮数字

最佳答案

数字'-12345678969'需要太多位用于int。大多数C编译器中的int是32-bits wide,但是不足以包含'-12345678969'的位。

atoi()只是尝试将数字转换为32位整数,这意味着输入值-12345678969的一部分被截断了;在基数2(二进制)表示中,输入数字将适合64位整数,如下所示:

1111111111111111111111111111110100100000001000111110001110000111

而当atoi()切断高阶32位时,低阶32位将保留:

00100000001000111110001110000111

不再包含任何符号(您从左先读取的位是0,表示没有符号,因此在带符号的int中数字不是负数)。

该数字以十进制表示将等于539222919,这是您在本例中看到的数字。

关于c - 为什么将命令行参数-12345678969视为> 1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48842620/

10-10 14:08