为什么我的 C long 不能存储比普通 Int 更大的数字?

问题描述 投票:0回答:1

由于某种原因,我无法获得数字 4294967296 或任何更大的数字来存储在长整型中。 在第二次运行循环时,变化变量在乘以 0 后变为 0,尽管它是一个 long。

unsigned long interleave(unsigned int i1, unsigned int i2) {
    long int out = 0l;
    unsigned long r1;
    unsigned long r2;
    unsigned long change;
    change = 1l;
    unsigned long store;
    unsigned long bitSize = 256l;
    printf("%010x + %010x = ", i1, i2);
    //printf("START CHANGE %016x or %lu\n", change, change);
    for (int i = 3; i >= 0; i--) {
        //Get remainder for int 1;
        r1 = (unsigned long)i1 % (unsigned long)bitSize;
        i1 = (unsigned long)i1 / (unsigned long)bitSize;
        //Get remainder for int 2;
        r2 = (unsigned long)i2 % (unsigned long)bitSize;
        i2 = (unsigned long)i2 / (unsigned long)bitSize;
        //printf("GOT %04x and %04x\n", r1, r2);
        store = ((unsigned long)r1 * (unsigned long)bitSize) + (unsigned long)r2;
        store = (unsigned long)store * (unsigned long)change;
        //printf("STORE %016x\n", store);
        change = ((unsigned long)change) * ((unsigned long)bitSize);
        printf("CHANGE AFTER FIRST MULTIPLICATION: %016x or %lu\n", change, change);
        change = ((unsigned long)change) * ((unsigned long)bitSize);
        printf("CHANGE AFTER SECOND MULTIPLICATION: %016x or %lu\n", change, change);
        //printf("OUT: %016x\n", out);
        out += (unsigned long)store;
    }
    printf("%016x", out);

}

int main() {
    interleave((unsigned)4294967295, (unsigned)2999999);
    char* ch;
    scanf("%c%c", ch, ch);
}

我尝试将数据类型切换为“long long”、“long int”或“long long int”。似乎没有一个起作用。我现在已明确将所有 athematic 转换为“unsigned long”,但这也失败了。该函数应该在每个字节的基础上交错两个整数,因此“c245a1”和“1e67ba”应该交错为“c21e4567a1ba”。相反,由于某种原因,当我使用 long 时,它不能容纳那么大的东西,“long long”也不能。

c long-integer
1个回答
2
投票
unsigned long interleave(unsigned int i1, unsigned int i2) {
    unsigned long long int out = 0l;
    unsigned long long int r1;
    unsigned long long int r2;
    unsigned long long int change;
    change = 1ll;
    unsigned long long store;
    unsigned long long bitSize = 256l;
    printf("%08x + %08x = ", i1, i2);
    for (int i = 3; i >= 0; i--) {
        //Get remainder for int 1;
        r1 = (unsigned long long)i1 % (unsigned long long)bitSize;
        i1 = (unsigned long long)i1 / (unsigned long long)bitSize;
        //Get remainder for int 2;
        r2 = (unsigned long long)i2 % (unsigned long long)bitSize;
        i2 = (unsigned long long)i2 / (unsigned long long)bitSize;
        store = ((unsigned long long)r1 * (unsigned long long)bitSize) + (unsigned long long)r2;
        store = (unsigned long long)store * (unsigned long long)change;
        change = ((unsigned long long)change) * ((unsigned long long)bitSize);
        change = ((unsigned long long)change) * ((unsigned long long)bitSize);
        out += (unsigned long long)store;
    }
    printf("%016llx", out);
    return out;
}

感谢 Barmar 和 dbush。事实证明,我系统上的 long 与 int 的大小相同,我需要按照 Barmar 的建议将其更改为 Long Long。但是我没有意识到这已经解决了问题,因为我需要在 printf 中使用“llx”而不是“x”,以便按照 dbush 建议查看其余数字。如果其他人遇到此类问题,只需将您的 long 更改为 long long 并查看是否可以解决问题,同时检查打印是否正确。

© www.soinside.com 2019 - 2024. All rights reserved.