这是检查给定号码是否为阿姆斯特朗号码的程序
#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/