由于某种原因,我无法获得数字 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”也不能。
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 并查看是否可以解决问题,同时检查打印是否正确。