以下のコードは正しいですか?私の理解では、正しく動作してはいけませんが、Dev-C++コンパイラでは、そうです。ロングIntの%d
#include<limits.h>
int main()
{
long int num_case=LONG_MAX;
scanf("%d",&num_case);
printf("%ld",num_case);
return 0;
}
おかげで、標準Cライブラリには、あなたがしないよう指示ほとんどの事のように
以下のコードは正しいですか?私の理解では、正しく動作してはいけませんが、Dev-C++コンパイラでは、そうです。ロングIntの%d
#include<limits.h>
int main()
{
long int num_case=LONG_MAX;
scanf("%d",&num_case);
printf("%ld",num_case);
return 0;
}
おかげで、標準Cライブラリには、あなたがしないよう指示ほとんどの事のように
は、それは未定義の動作を呼び出します。定義されていないとは、あなたが少なくともそれを予期していないときにクラッシュすることがあります。
この場合、long int
とint
は実際には同じ数値表現です:4バイト、2の補数です。別のプラットフォーム(たとえばx86-64 Linux)では、そうではないかもしれません。おそらく何らかの問題が発生するでしょう。特に、8バイトのlong int
の上位バイトは初期化されずに残されます。
EDIT:が求めて "それがクラッシュします" 間違った方法を考えです。初期化されていないバイトをタイプlong int
の変数に読み込むだけで、言語標準に従ってCプログラムがクラッシュする可能性があります。私たちは、プログラムが不適切であることを理解するために、プラットフォームの例を見つける必要はありません。そこが肝心だ。 Cはあなたにすぐにルールブックを投げず、あなたが最初の仮定を入れて壊すまで待つ。
を参照してください。x86-64がWindowsの場合、long intは32ビットのままです。 – dbrank0
本当に問題がありますか?つまり、数字は私たちが望むものを表しているわけではありませんが、プログラムが何らかの形でクラッシュすることはありません。 64ビットに関する64ビットである唯一の真の整数型は、C99で導入され、C++ 11標準の一部である長いlong longです。 – Geoffroy
@Geoffroy初期化されていない値または予期しない値を持つプログラムを実行しようとするとクラッシュする可能性があります。私は「ある種の問題」と言った。通常、クラッシュだけでなく、すべての誤動作を避けたい。 Mac OSとLinuxでは、「long」と「long long」は両方とも64ビットです。私はWindowsがそうでないことを認識していませんでしたが、何も変更されません。 – Potatoswatter
RageDによれば、実際にはscanf()
呼び出しで%ldを使用する必要があります。なぜなら、あなたのシステム(またはそれが私に見える)で、int
とlong int
は同じサイズ(おそらくは4)なので、scanf()
はそうしてはならないメモリを上書きしないからです。
通常、32ビットシステムではlong intは32ビット(intと同じ)、64ビットシステムlong intは64ビット(long long intと同じ)です。あなたのコードをポータブルにするには、scanfを "%ld"で使用してください。
あなたが期待しているのであれば '%ld'を' scanf'する必要があります。しかし、 'long'が典型的な' int'よりも大きいので、これに問題はありません。 – RageD
** Dev-C++に付属のコンパイラは使用しないでください** - これは古くなっています! http://www.jasonbadams.net/20081218/why-you-shouldnt-use-dev-c/ – ThiefMaster