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.

d100000000且乘法超出类型int的范围时,d = d * 100在第5次迭代时出现算术溢出。将类型更改为 longlong long 将解决此问题。

类型 long 在您的机器上可能有 64 位,但为了便携性,您应该使用 long longunsigned long long 来表示 creditd

代码可能更容易理解,方法略有不同,即除以数字而不是乘以除数。

这是修改后的版本:

#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]);
    }
}