기본 주소와 최상위 주소로 지정된 메모리 블록에 패턴을 쓰는 코드 (FPGA에서 실행 됨)를 작성 중입니다. 데이터 폭은 64 비트이고 주소 공간은 32 비트입니다. 내 시스템에서 longs는 32 비트이고 long long은 64 비트입니다. 코드는 다음과 같은 :32 비트 주소 공간에 64 비트 정수 반복기를 사용합니까?
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;
}
모든 것이 잘 작동하지만 컴파일러에서 경고 "다른 크기의 정수에서 포인터로 캐스트"는 얻을. 32 비트 반복자 변수를 사용하면 반복기가 0xFFFFFFFC를 히트하고 0으로 다시 오버플로되기 때문에 코드가 무한 루프됩니다.
더 좋은 방법이 있나요? 32 비트 이터레이터를 문제없이 사용하는 방법이 많이 있다는 것을 알고 있습니다. (오버플로를 예측/예측하여 high_addr에서 3을 뺍니다.)하지만이 코드는 가장 간단하고 읽기 쉽습니다. 알려진 컴파일러 오류가있는 코드를 작성하는 것이 좋지 않은 스타일로 간주됩니까?