为什么 C 在对大于 10 位的整数进行运算时会输出乱码结果?
Why does C outputs gibberish results when operation on an integer greater than 10 digits?
下面给出的代码在使用(int
数据类型)时最多可工作 10 位数字,但对于超过 10 位数字的数字它失败了,所以我尝试了 unsigned long long int
。但是现在我的输出固定为 15 ,我不知道为什么?考虑到我是 C 的新手,但我的 python 背景一般!
我正在使用 gcc (Ubuntu 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609
#include <stdio.h> //Get number of digits in a int
unsigned long long int get_len();
void main() {
unsigned long long int num;
printf("Enter the number:");
scanf("%d",&num);
printf("\nThe length of number is is: %d \n",get_len(num));
}
unsigned long long int get_len(unsigned long long int z) {
unsigned long long int i = 1;
while (1) {
if ((z/10) > 1) {
//printf("Still greater than 1");
i++;
z = z/10;
continue;}
else {
return(i+1);
break;}}}
您使用了错误的格式说明符。它将是 scanf("%llu",&num);
在 scanf
中使用错误的格式说明符是未定义的行为。
除了提到的内容之外,您的长度查找逻辑是错误的,因为它对于一位数字和多位数字都会失败。
对于 1
它将 return 位数 2
和类似的其他数字。 (比如 12
它将 return 3
)。
对于更大的数字,您可以选择一个库(大数字处理)或根据需要编写一个。
我会像这样扫描数字
if( scanf("%llu",&num) != 1) { /* error */}
。更清楚地检查scanf
的return值。
这是另一个实现。这解决了一些问题:
- 主要 return 类型必须是
int
.
unsigned int
足以满足 get_len()
return 类型。
unsigned int
和unsigned
是一样的。 unsigned long long int
也可以去掉 int
.
#include <stdio.h>
unsigned get_len();
int main()
{
unsigned long long num;
printf("Enter the number: ");
scanf("%llu", &num);
printf("\nThe length of number is: %u\n", get_len(num));
}
unsigned get_len(unsigned long long z)
{
return (z / 10 > 0) ? get_len(z / 10) + 1 : 1;
}
下面给出的代码在使用(int
数据类型)时最多可工作 10 位数字,但对于超过 10 位数字的数字它失败了,所以我尝试了 unsigned long long int
。但是现在我的输出固定为 15 ,我不知道为什么?考虑到我是 C 的新手,但我的 python 背景一般!
我正在使用 gcc (Ubuntu 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609
#include <stdio.h> //Get number of digits in a int
unsigned long long int get_len();
void main() {
unsigned long long int num;
printf("Enter the number:");
scanf("%d",&num);
printf("\nThe length of number is is: %d \n",get_len(num));
}
unsigned long long int get_len(unsigned long long int z) {
unsigned long long int i = 1;
while (1) {
if ((z/10) > 1) {
//printf("Still greater than 1");
i++;
z = z/10;
continue;}
else {
return(i+1);
break;}}}
您使用了错误的格式说明符。它将是 scanf("%llu",&num);
在 scanf
中使用错误的格式说明符是未定义的行为。
除了提到的内容之外,您的长度查找逻辑是错误的,因为它对于一位数字和多位数字都会失败。
对于 1
它将 return 位数 2
和类似的其他数字。 (比如 12
它将 return 3
)。
对于更大的数字,您可以选择一个库(大数字处理)或根据需要编写一个。
我会像这样扫描数字
if( scanf("%llu",&num) != 1) { /* error */}
。更清楚地检查scanf
的return值。
这是另一个实现。这解决了一些问题:
- 主要 return 类型必须是
int
. unsigned int
足以满足get_len()
return 类型。unsigned int
和unsigned
是一样的。unsigned long long int
也可以去掉int
.
#include <stdio.h> unsigned get_len(); int main() { unsigned long long num; printf("Enter the number: "); scanf("%llu", &num); printf("\nThe length of number is: %u\n", get_len(num)); } unsigned get_len(unsigned long long z) { return (z / 10 > 0) ? get_len(z / 10) + 1 : 1; }