値がsizeof演算子に直接渡されると、データ型のサイズが異なるのはなぜですか?


15
#include <stdio.h>
int main() {
    char a = 'A';
    int b = 90000;
    float c = 6.5;
    printf("%d ",sizeof(6.5));
    printf("%d ",sizeof(90000));
    printf("%d ",sizeof('A'));
    printf("%d ",sizeof(c));
    printf("%d ",sizeof(b));
    printf("%d",sizeof(a));
    return 0;
}

出力は次のとおりです。

8 4 4 4 4 1

同じ値に対して出力が異なるのはなぜですか?


12
6.5フロートではない、それはdouble
NathanOliver

printf("%d",sizeof(6.5f));それをするためにfloat
ジョニーモップ

2
「なぜここで出力が異なるのですか?」なぜ同じでなければならないのですか?1つを別のものに割り当てることができるという事実は、それらが完全に同じタイプであることを意味しません。
スラバ

5
フォーマット指定子は、たとえばprintf("%zu", sizeof(6.5));
Weather Vane

回答:


9

Cの文字定数(C ++の反対)の型はintです。したがって、この呼び出し

printf("%d",sizeof('A'));

出力4.これはsizeof( 'A' )と同じsizeof( int )です。

C標準から(6.4.4.4文字定数)

10 整数文字定数の型はint ...です。

一方(6.5.3.4 sizeofおよびalignof演算子)

4 char型、unsigned char型、signed char型(またはそれらの修飾バージョン)のオペランドにsizeofを適用すると、結果は1になります。

したがって、sizeofこの式の演算子のオペランドのsizeof( 'A' )型はintですが、この式sizeof( a )ではaが次のように宣言されています。

char a = 'A';

オペランドのタイプはcharです。

このような呼び出しに注意してください

printf("%d",sizeof(6.5));

正しくない変換形式指定子を使用してください。あなたは書く必要があります

printf("%zu",sizeof(6.5));

上記の呼び出しでも型の定数が使用されていますがdouble、この呼び出しでは

printf("%zu",sizeof(c));

変数cのタイプはfloatです。

最初の呼び出しがfloat型の定数を使用した場合、これらの呼び出しで同じ結果を得ることができます

printf("%zu",sizeof(6.5f));

19

変数と同様に、定数には独自のタイプがあります。

  • 6.5 :タイプの浮動小数点定数 double
  • 90000:タイプの整数定数intint32ビットの場合)またはlongint16ビットの場合)
  • 'A'intCおよびcharC ++のタイプの文字定数

記載されているサイズは上記タイプのサイズです。

また、sizeof演算子の結果はtypeになりsize_tます。したがって、使用する適切な形式指定子を出力するときは%zu、ではなく%dです。


1

値は関係ないからsizeofです。タイプのサイズです。

  • 文字定数はintsではなくcharsです。

  • 浮動小数点定数は、double接尾辞forまたはを付けない限り、デフォルトではsですl

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.