2013-03-13 3 views
1

Почему длинное значение не печатается, как я ожидаю в следующем фрагменте кода?Почему долгое долгое значение не печатается правильно?

#include <stdio.h> 

int main() 
{ 
    int x = 1363177921; 
    long long unsigned y = x * 1000000; 
    printf("y: %llu\n", y); // Why is 1363177921000000 not printed? 
    return 0; 
} 
+1

Вы можете выделить расчет и печать, добавив строку «assert (y == 1363177921000000)»; (который потерпел бы неудачу) перед printf. –

ответ

7

Это не ошибка печати. У вас есть целочисленное переполнение в:

long long unsigned y = x * 1000000; 

Изменить что:

long long unsigned y = x * 1000000ull; 
4

Потому что ваш x не long long, ни 1000000 - это только преобразуется в long long ПОСЛЕ умножения.

Сделайте это 1000000ULL, и вы получите то, что хотите.

1

проблема в том, что x является int и 1000000 будет длинным. Теперь компилятор будет умножать их, как это было умножая 2 долго, а затем результат преобразуются в длинную длинную

Чтобы решить добавить неявные типажи, прежде чем х или 100000 или преобразовать й в долго долго, как показывает ниже

#include <stdio.h> 

int main() 
{ 
     int x = 1363177921; 
     long long unsigned y = (long long)x * 1000000; 
     printf("y: %llu\n", y); // Why is 1363177921000000 not printed? 
     return 0; 
} 

http://codepad.org/rLW8fGTA