2013-01-09 3 views
1

MIPS 용으로 컴파일 된 프로그램을 실행할 때 아주 이상한 문제가 발생했습니다. 다음 코드 스 니펫은 시간 신기원을 가져 와서 마이크로 초 정밀도로 unsigned long long 변수에 저장하는 것입니다.부호없는 long long C에서 이상한 행동

변수는 내가 확인한 8 바이트를 저장할 수 있으며 sizeof(unsigned long long)입니다.

이 코드는 이상하게 출력합니다 : 나는 다른 라인으로 계산을 깰 때

그러나
>> Times is now 484305845 , time since epoch in seconds is: 1357751315 

는, 작동 :

unsigned long long microtime=0; 
struct timeval time_camera = { .tv_sec=0, .tv_usec=0 }; 
gettimeofday(&time_camera,NULL); 
microtime = time_camera.tv_sec * 1000000 + time_camera.tv_usec; 
printf("Times is now %llu , time since epoch in seconds is: %lu\n", microtime, time_camera.tv_sec); 

그것은 나에게 다음과 같은 출력을 제공합니다! :

unsigned long long microtime=0; 
struct timeval time_camera = { .tv_sec=0, .tv_usec=0 }; 
gettimeofday(&time_camera,NULL); 
microtime = time_camera.tv_sec; 
microtime = microtime * 1000000; 
microtime = microtime + time_camera.tv_usec; 
printf("Times is now %llu , time since epoch in seconds is: %lu\n", microtime, time_camera.tv_sec); 

출력은 다음과 같습니다

Times is now 1357751437422143 , time since epoch in seconds is: 1357751437 

는 이제이 작동 단지 우연의 일치인가? 예를 들어 메모리가 손상되었거나 실제로 어딘가에 초과했습니다. MIPS 컴파일러일까요? 어떤 도움을 주셔서 감사합니다!

답변

9
microtime = time_camera.tv_sec * 1000000 + time_camera.tv_usec; 

tv_sec 때문에,

time_camera.tv_sec * 1000000 
작은 정수형 ( time_t, 아마 int 또는 long)입니다

오버플로 이미 동일한 종류가 있으므로 다른 것과 변환되어 하나의 피연산자 (microtime)을하기 때문에,

microtime = time_camera.tv_sec; 
microtime = microtime * 1000000; 

곱셈 unsigned long long에서 수행에 적절한 형태를 상수를

time_camera.tv_sec * 1000000ULL 

주고 접미어를 사용 .

4

에 할당하기 전에 size_t 수학이 진행중인 것처럼 보입니다. 상수 다음에 ULL을 넣으십시오.

또 다른 방법은 (unsigned long long) 1000000입니다. 곱셈의 피연산자 중 적어도 하나에서이 값을 얻는 한 결과는 더 높은 우선 순위 유형이 될 것이라고 확신 할 수 있습니다. 내재 형 변환 우선 순위 규칙 (순서 최고 최저까지) 위치 :

long double =>double =>float =>unsigned long long =>long long =>unsigned long =>long =>unsigned int = "int

+0

우선 순위 규칙을 게시 해 주셔서 감사합니다. – Mazze