2015-04-30 3 views
0

Следующий код - это, например, 1030432081 (что неверно) при компиляции с gcc -m32 time.c, тогда как он отлично работает при компиляции без флага -m32. Есть ли способ заставить это работать?Как использовать uint64_t и -m32?

#include <sys/time.h> 
#include <stdio.h> 
#include <stdint.h> 
#include <inttypes.h> 

void test() { 
    struct timeval t; 
    gettimeofday(&t, NULL); 
    uint64_t microseconds = t.tv_usec + t.tv_sec * 1000000; 
    printf("%"PRId64, microseconds); 
} 

int main() { 
    test(); 
} 
+0

'(uint64_t) 1000000' –

+0

Это решает проблему. Можете ли вы объяснить, почему? (Если вам нравится, отправьте его как ответ) – ben

ответ

1

Целочисленная константа имеет тип int, если она подходит. Это относится к 1000000 в режиме 32 бит и 64 бит.

Поэтому в режиме 32 бит t.tv_usec, t.tv_sec и 1000000 - все 32 бита и результат, который тоже переполняется. Только после вычисления результат преобразуется в 64 бита.

Если вы передали константу в 64 бита, то t.vv_sec продвигается до 64 бит перед умножением, а также t.tv_usec продвигается до 64 бит перед добавлением. Фактически вы вынуждаете весь расчет выполнять в 64 бит. Результат, который является правильным и уже 64 бит, затем сохраняется.

+0

Нет, целочисленная константа может иметь тип 'int',' unsigned int', 'long int',' unsigned long int', 'long long int' или' unsigned long long int', в зависимости от его значения, от того, является ли оно десятичным против восьмеричного или шестнадцатеричного, и от того, имеет ли он суффикс ('U',' L', 'UL',' LL', 'ULL'). В частности, '1000000' имеет тип' int' * if * 'INT_MAX> = 1000000'; если 'int' - 16 бит, он будет иметь тип' long int'. Подробнее см. В [N1570] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf). 6.4.4.1. –

Смежные вопросы