0

Windows コンピューターで Codeblocks と GNU コンパイラーを使用しています。コンパイラは、次の条件で実行されます。

mingw32-gcc.exe -Wall -g -std=c11 <filename> -o obj\Debug\main.o

私のコードは次のとおりです。

#include <stdio.h>
#include <limits.h>

int main()
{
    printf("INTEGER min: %d\n", INT_MIN);
    printf("INTEGER max: %d\n\n", INT_MAX);
    printf("UNSIGNED INTEGER max: %u\n\n", UINT_MAX);
    printf("LONG INTEGER min: %ld\n", LONG_MIN);
    printf("LONG INTEGER max: %ld\n\n", LONG_MAX);
    //printf("LONG LONG INTEGER min: %lld\n", LONG_LONG_MIN);
    //printf("LONG LONG INTEGER max: %lld\n\n", LONG_LONG_MAX);
    printf("UNSIGNED LONG INTEGER max: %lu\n\n", ULONG_MAX);
    //printf("UNSIGNED LONG LONG INTEGER max: %lld\n", ULONG_LONG_MAX);
    printf("\n");
    return 0;
}

このコードの私の出力:

INTEGER min: -2147483648
INTEGER max: 2147483648

UNSIGNED INTEGER max: 4294967295

LONG INTEGER min: -2147483648
LONG INTEGER max: 2147483648

UNSIGNED LONG INTEGER max: 4294967295

LONG LONG 整数を参照する行は、コンパイラがエラーを出していたため、コメント アウトされています。

error: 'LONG_LONG_MIN' undeclared (first use in this function)
error: 'LONG_LONG_MAX' undeclared (first use in this function)
error: 'ULONG_LONG_MAX' undeclared (first use in this function)

ただし、コードを入力している間、CodeBlocks は、LONG_LONG 定数を実際に使用できることを示すコード ヒントを提供しました。したがって、次の質問に対する回答が必要です。

  1. 整数と長整数の制限が同じなのはなぜですか? long 整数の値の範囲を大きくするべきではありませんか?
  2. LONG_LONG 定数で問題が発生するのはなぜですか? これは、long long 整数を使用できないということですか?

ありがとう

4

4 に答える 4

2

整数と長整数の制限が同じなのはなぜですか? long 整数の値の範囲を大きくするべきではありませんか?

C 言語の特徴の 1 つであるその適応性に足を踏み入れました。

C では、 の範囲はint少なくとも と同じくらい広くshort、 の範囲は少なくとも と同じくらい広いと定義longされていintます。すべてに最小範囲があります。

の範囲を正確に定義するのではなくshort, int, long、C は汎用性を選択しました。OP のプラットフォームでは、 の範囲は(32 ビット)intの範囲と一致します。long2016 年の多くの組み込みプロセッサ (および 70 年代、80 年代の家庭用コンピューター) では、 の範囲は(16 ビット)の範囲とint一致します。short一部のプラットフォーム (64 ビット) では、 の範囲が をint超えshortより狭くなり longます。したがって、OPの質問に直接:intと常に同じ範囲を持つとは限りませんlong

秘訣は、それintが単なるsinged char, short, int, long, long longはしごの段ではないということです。整数型です通常の整数昇格を考えると、すべてのナロー型は に昇格しintます。 多くintの場合、プロセッサのネイティブ ビット幅です。

ほとんどのコードはint32 ビットで記述されており、大部分は 16 ビットでも記述されています。64 ビット プロセッサでは、64 ビットとして使用できますが、 8、16、および 32 ビットint用の 2 つの標準タイプのみが残ります。signed char, short

今後は、 range the range 、 range the range 、 range the range などを簡単にカウントします。また、少なくとも8ビットsigned char少なくとも16ビット、少なくとも32ビット、少なくとも64ビットです。コードに明示的な幅が必要な場合は、、 などを使用します。<=shortshort<=intint<=longsigned charshort, intlonglong longint8_tint16_t

C が 40 年以上後に使用されているという事実は、この汎用性にメリットがある/あったことを証明しています。

[議論は、簡潔にするために、署名されていない型を省略_Bool_tcharます。まれな非 2 の累乗型 (9、18、24、36 など) も省略されています]

于 2016-04-12T04:38:16.457 に答える
1

特定の実装を持つシステムの limits.h に加えて、C 標準がさまざまな整数の制限を定義しているものも確認してください。

以下に示す値は、#if 前処理ディレクティブでの使用に適した定数式に置き換えられます。さらに、CHAR_BIT と MB_LEN_MAX を除いて、以下は整数昇格に従って変換された対応する型のオブジェクトである式と同じ型を持つ式に置き換えられます。それらの実装定義の値は、大きさが等しいかそれ以上でなければならない

(absolute value) to those shown, with the same sign.
-- number of bits for smallest object that is not a bit-field (byte)
   CHAR_BIT                                            8
-- minimum value for an object of type signed char
   SCHAR_MIN                                -127 // -(27 - 1)
-- maximum value for an object of type signed char
   SCHAR_MAX                                +127 // 27 - 1
-- maximum value for an object of type unsigned char
   UCHAR_MAX                                 255 // 28 - 1
-- minimum value for an object of type char
   CHAR_MIN                               see below
-- maximum value for an object of type char
   CHAR_MAX                              see below
-- maximum number of bytes in a multibyte character, for any supported locale
   MB_LEN_MAX                                    1
-- minimum value for an object of type short int
   SHRT_MIN                               -32767 // -(215 - 1)
-- maximum value for an object of type short int
   SHRT_MAX                               +32767 // 215 - 1
-- maximum value for an object of type unsigned short int
   USHRT_MAX                               65535 // 216 - 1
-- minimum value for an object of type int
   INT_MIN                                 -32767 // -(215 - 1)
-- maximum value for an object of type int
   INT_MAX                                +32767 // 215 - 1
-- maximum value for an object of type unsigned int
   UINT_MAX                                65535 // 216 - 1
-- minimum value for an object of type long int
   LONG_MIN                         -2147483647 // -(231 - 1)
-- maximum value for an object of type long int
   LONG_MAX                         +2147483647 // 231 - 1
-- maximum value for an object of type unsigned long int
   ULONG_MAX                         4294967295 // 232 - 1
-- minimum value for an object of type long long int
   LLONG_MIN          -9223372036854775807 // -(263 - 1)
-- maximum value for an object of type long long int
   LLONG_MAX          +9223372036854775807 // 263 - 1
-- maximum value for an object of type unsigned long long int
   ULLONG_MAX         18446744073709551615 // 264 - 1

http://www.iso-9899.info/n1570.html#5.2.4.2.1より

于 2016-04-12T04:39:56.603 に答える