C 对32位地址空间使用64位整数迭代器?
我正在编写一些代码(在FPGA上运行),将模式写入由基址和最高地址指定的内存块。数据宽度为64位,地址空间为32位。在我的系统上,long是32位,long是64位。代码如下所示:C 对32位地址空间使用64位整数迭代器?,c,memory,integer,compiler-warnings,C,Memory,Integer,Compiler Warnings,我正在编写一些代码(在FPGA上运行),将模式写入由基址和最高地址指定的内存块。数据宽度为64位,地址空间为32位。在我的系统上,long是32位,long是64位。代码如下所示: unsigned long base_addr = 0xC0000000; unsigned long high_addr = 0xFFFFFFFF; unsigned long long i; for(i = base_addr; i <= high_addr; i += 4){ *((unsign
unsigned long base_addr = 0xC0000000;
unsigned long high_addr = 0xFFFFFFFF;
unsigned long long i;
for(i = base_addr; i <= high_addr; i += 4){
*((unsigned long *) i) = some_pattern;
}
unsigned long base\u addr=0xc000000;
无符号长高_addr=0xFFFFFFFF;
未签名的长i;
对于(i=base_addr;i为什么要将i
声明为unsigned long
?这有什么意义
正如您自己所说,您平台上的地址是32位。将i
声明为无符号长
,就像base\u addr
和high\u addr
一样。警告应该会消失
同时,“数据宽度为64位”的含义是什么?如果数据(和模式)实际上是64位,那么您应该这样做
for (i = base_addr; i <= high_addr; i += 8){ /* or i += sizeof(unsigned long long) */
*((unsigned long long *) i) = some_pattern;
}
for(i=base\u addr;i为什么要将i
声明为unsigned long
?这有什么意义
正如您自己所说,您平台上的地址是32位。将i
声明为无符号长
,就像base\u addr
和high\u addr
一样。警告应该会消失
同时,“数据宽度为64位”的含义是什么?如果数据(和模式)实际上是64位,那么您应该这样做
for (i = base_addr; i <= high_addr; i += 8){ /* or i += sizeof(unsigned long long) */
*((unsigned long long *) i) = some_pattern;
}
for(i=base\u addr;i我对更好的方法的想法:
unsigned long long *base_addr = (unsigned long long *)0xC0000000;
unsigned long long *high_addr = (unsigned long long *)0xFFFFFFFF;
unsigned long long *i;
for (i = base_addr; i < high_addr; ++i) {
*i = some_pattern;
}
无符号长*基地址=(无符号长*)0xC0000000;
无符号长*高地址=(无符号长*)0xFFFFFFFF;
无符号长*长*i;
对于(i=基本地址;i<高地址;++i){
*i=某种模式;
}
如果i
,可能需要小心指针(i)环绕,通过中止for循环。我的想法是一种更好的方法:
unsigned long long *base_addr = (unsigned long long *)0xC0000000;
unsigned long long *high_addr = (unsigned long long *)0xFFFFFFFF;
unsigned long long *i;
for (i = base_addr; i < high_addr; ++i) {
*i = some_pattern;
}
无符号长*基地址=(无符号长*)0xC0000000;
无符号长*高地址=(无符号长*)0xFFFFFFFF;
无符号长*长*i;
对于(i=基本地址;i<高地址;++i){
*i=某种模式;
}
如果i
,可能需要通过中止for循环来小心指针(i)环绕