次のコードスニペットで期待するように、long long値が出力されないのはなぜですか?
#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;
}
次のコードスニペットで期待するように、long long値が出力されないのはなぜですか?
#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;
}
間違っているのは印刷ではありません。次の整数オーバーフローがあります。
long long unsigned y = x * 1000000;
それを次のように変更します。
long long unsigned y = x * 1000000ull;
あなたx
は ではなくlong long
、そうでもないため、乗算後1000000
にのみ変換されます。long long
そうすれば、あなた1000000ULL
が望むものを手に入れることができます。
問題は、xがintであり、1000000が長くなることです。これで、コンパイラは2 longを乗算していたのでそれらを乗算し、結果はlonglongに変換されます。
解決するには、xまたは100000の前に暗黙の型キャストを追加するか、以下に示すようにxをlongに変換します。
#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;
}