Mingw / Windowsで長い長い数字を出力する

long long型はc99標準に登場しました。 32ビットアーキテクチャでは、このタイプのサイズは64ビットです。 標準では、このタイプのprintfに似た関数のフォーマット文字列を導入しています:%lld(%llu for unsigned)。

しかし、よくあることですが、ディレクトリからの書き込みだけが常に機能するとは限りません。 MinGW / GCCを使用してコードを再コンパイルする必要性に直面したため(GNU / LinuxとWindowsプラットフォーム間のコードの互換性と移植性を確保するはずです)、このタイプの動作は説明したものとは大幅に異なることがわかりました:数値は32ビットとして表示されました

MinGWはWindows関数の呼び出しを使用することが判明しました。 ご存知のように、Windowsは古いバージョンとの後方互換性に注意します。新しい標準が登場したとき、関数はそれに準拠していませんでしたが、このタイプには非標準のフォーマット文字列を使用し続けました:%I64d。 これを説明するmsd関連ページは次のとおりです-no %lld。

しかし、これにもかかわらず、Visual Studio 2005%lldはうまく処理されますが、windows関数を使用するMinGWでは処理されません。

要するに、ブードゥー教のプログラミング
結果:
C関数の代わりに標準のC ++クラスを使用する場合、そのような問題は発生しません。 0000001234の形式で数値を出力するためのソリューション(10文字、右揃え、空の位置をゼロで埋める)は次のようになります。

stringstream stream;
string str;
long long number = 1234LL;

stream.flags(ios::right);
stream.fill( '0' );
stream.width( 10 );

stream << number;
stream >> str;


結果:str == "0000001234";

Source: https://habr.com/ru/post/J51081/


All Articles