这是我的代码:
#define MSK 0x0F
#define UNT 1
#define N 3000000000
unsigned char aln[1+N];
unsigned char pileup[1+N];
void set(unsigned long i)
{
if ((aln[i] & MSK) != MSK ) {
aln[i] += UNT;
}
}
int main(void) {}
当我尝试编译它时,编译器会这样提示:
tmp/ccJ4IgSa.o: In function `set':
bitmacs.c:(.text+0xf): relocation truncated to fit: R_X86_64_32S against symbol `aln' defined in COMMON \
section in /tmp/ccJ4IgSa.o
bitmacs.c:(.text+0x29): relocation truncated to fit: R_X86_64_32S against symbol `aln' defined in COMMON\
section in /tmp/ccJ4IgSa.o
bitmacs.c:(.text+0x32): relocation truncated to fit: R_X86_64_32S against symbol `aln' defined in COMMON\
section in /tmp/ccJ4IgSa.o
我觉得可能是N
太大了,因为把N改成2000000000也能编译成功,但是我需要3000000000作为N的值。
有人知道吗?
最佳答案
根据您最初的问题:使用整数文字后缀 UL (或类似的)来强制 N 的存储类型:
#define N 3000000000UL
但是,(根据您对 HLundvall 的回答的评论)relocation truncated to fit
错误显然不是因为这个 - 它可能(如 Mystical 和 Matt Lacey 所说)只是太大而不适合在片段中。
顺便说一句,如果你问一个单独的问题来解释你试图用你的大数组完成什么,有人可能会建议一个更好的解决方案(更可能适合内存)
例如:
- 您的示例代码仅使用所示代码中每个字节的低半字节:您可以将其打包成一半大小(诚然这仍然太大)
- 根据您的访问模式,您可以将阵列保留在磁盘上并将工作子集缓存在内存中
- 如果我们知道您需要什么,可能会有更好的整体算法和数据结构
关于c++ - 如何对无符号长数使用宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11978826/