c语言打印四个正确值后数组打印奇怪值
Array printing strange values after printing four correct values in c language
我正在尝试从一系列整数值中打印前两位数字。但是在选择每个值并将它们存储在数组中之后。当我尝试打印值时,数组往往只正确存储前四个值,然后其余值变得奇怪。这是我下面的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main(void)
{
long credit = 24681482846434;
int mid_length = (14 / 2); // length of array
int arr[mid_length];
int d = 100;
int count = 1;
//loop to get the first second numbers
for (int i = mid_length - 1; i >= 0; i--) {
arr[i] = (credit % d) / (d / 10);
d = d * 100;
printf("%d\n", arr[i]);
count++;
}
}
这是输出:
3
6
8
8
7
0
9
credit/ $
最有可能发生的情况是您没有为 credit
使用足够大的整数类型。虽然在某些系统上,long
足以容纳 63 位整数(如果 unsigned
则为 64 位),C 标准仅要求它足够大以容纳 31 位整数(32 -位如果 unsigned
)。您尝试存储到 credit
中的数字是一个 45 位整数,它可能太大,因此被截断为较小的数字。
如果这是问题所在,您需要切换到更大的整数类型。 long long
要求足够大。您还可以包含 stdint.h 并显式使用 64 位整数类型:uint64_t
.
当d
为100000000
且乘法超出类型int
的范围时,d = d * 100
在第5次迭代时出现算术溢出。将类型更改为 long
或 long long
将解决此问题。
类型 long
在您的机器上可能有 64 位,但为了便携性,您应该使用 long long
或 unsigned long long
来表示 credit
和 d
。
代码可能更容易理解,方法略有不同,即除以数字而不是乘以除数。
这是修改后的版本:
#include <stdio.h>
int main() {
long long credit = 24681482846434;
int mid_length = (14 + 1) / 2; // length of array
int arr[mid_length];
//loop to get the first digit of digit pairs
long long temp = credit;
for (int i = mid_length; i --> 0;) {
int pair = temp % 100;
temp /= 100;
arr[i] = pair / 10;
printf("%d\n", arr[i]);
}
}
我正在尝试从一系列整数值中打印前两位数字。但是在选择每个值并将它们存储在数组中之后。当我尝试打印值时,数组往往只正确存储前四个值,然后其余值变得奇怪。这是我下面的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main(void)
{
long credit = 24681482846434;
int mid_length = (14 / 2); // length of array
int arr[mid_length];
int d = 100;
int count = 1;
//loop to get the first second numbers
for (int i = mid_length - 1; i >= 0; i--) {
arr[i] = (credit % d) / (d / 10);
d = d * 100;
printf("%d\n", arr[i]);
count++;
}
}
这是输出:
3
6
8
8
7
0
9
credit/ $
最有可能发生的情况是您没有为 credit
使用足够大的整数类型。虽然在某些系统上,long
足以容纳 63 位整数(如果 unsigned
则为 64 位),C 标准仅要求它足够大以容纳 31 位整数(32 -位如果 unsigned
)。您尝试存储到 credit
中的数字是一个 45 位整数,它可能太大,因此被截断为较小的数字。
如果这是问题所在,您需要切换到更大的整数类型。 long long
要求足够大。您还可以包含 stdint.h 并显式使用 64 位整数类型:uint64_t
.
当d
为100000000
且乘法超出类型int
的范围时,d = d * 100
在第5次迭代时出现算术溢出。将类型更改为 long
或 long long
将解决此问题。
类型 long
在您的机器上可能有 64 位,但为了便携性,您应该使用 long long
或 unsigned long long
来表示 credit
和 d
。
代码可能更容易理解,方法略有不同,即除以数字而不是乘以除数。
这是修改后的版本:
#include <stdio.h>
int main() {
long long credit = 24681482846434;
int mid_length = (14 + 1) / 2; // length of array
int arr[mid_length];
//loop to get the first digit of digit pairs
long long temp = credit;
for (int i = mid_length; i --> 0;) {
int pair = temp % 100;
temp /= 100;
arr[i] = pair / 10;
printf("%d\n", arr[i]);
}
}