5

sizeof() に関する質問に答えながら、GCC がどのように処理するかを確認するために、次のコードを書きました。

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

int main(int ac, char *argv[])
{
    printf("%zu\n", sizeof(9999999999999999999999999999999999999999999999999999) );
    printf("%zu %zu \n", sizeof(int), sizeof(long long));
    return 0;
}

コンパイルすると、GCC (4.1.2) は警告を発行しました (予想どおり):

t.c:8:24: warning: integer constant is too large for its type
t.c: In function main:
t.c:8: warning: integer constant is too large for long type

出力は次のとおりです。

16
4 8

sizeof(9999999999999999999999999999999999999999999999999999)GCCはそれが16だとどのように言いますか?! がどんなに大きくnumnberても、 より大きい整数リテラルの場合は常に 16 ですLLONG_MAX。私の 64 ビット プラットフォームsizeof(long)では に等しいsizeof(long long)です。

GCC がこのように動作するのはなぜですか? それはある種の未定義の動作ですか?!

4

5 に答える 5

6

gcc 自体に尋ねることができます。

__typeof__ (9999999999999999999999999999999999999999999999999999) var = 1;
printf("%lld\n", var);
sizes.c:10:5: warning: format ‘%lld’ expects argument of type ‘long long int’, but argument 2 has type ‘__int128’ [-Wformat]

そのため、 gcc は、サポートされている場合は__int128、大きすぎる 10 進定数の型を選択します。

于 2013-05-30T10:23:50.827 に答える
1

何がそんなに神秘的ですか?一番大きいタイプのサイズです。あなたは警告されました。

標準で保証されているのは、さまざまな型の相対的なサイズだけです。

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

于 2013-05-30T09:48:26.757 に答える
0

gcc はおそらくlong double非常に大きな数値にこの型を使用し、Intel プロセッサでは 80 ビットを使用します。したがって、おそらく128ビットの数値で保存されます。チェックする必要がありsizeof(long double)ます。

注: Visual C++ では gcc を使用しないため、明示的に gcc について言及します (そのlong double型は と同じdoubleです)。

編集:そうではないことが判明しましたlong double(そして、整数定数に関する標準C99 6.4.4.1 alinea 6(56ページ)によれば、許可されていません)。CliffordVienna と Daniel Fischer の回答を参照してください。

于 2013-05-30T09:58:22.870 に答える