0

編集: ばかげた質問です。形式識別子を見落としていました。

いくつかの符号なし型のサイズとそれらの最大値を取得するプログラムを用意しました。これは私の注意に異常をもたらしましたunsigned long long.8バイトだと思っていても、その範囲は4バイトの範囲に固定されているようです。(char は保証された 8 ビットバイトです)

質問私は、それが標準によって少なくとも保持するのに十分な大きさであるとのみ定義されている
ことを理解しています(または >= >=推移的に)。しかし、 4 バイトの範囲に制限されている場合と同じサイズではなく、なぜ 8 バイトのメモリを使用しているのでしょうか?unsigned long longintlong intintint

unsigned char:             255         1*sizeof(char)           
unsigned short:            65535       2*sizeof(char)        
unsigned short int:        65535       2*sizeof(char)       
unsigned int:              4294967295  4*sizeof(char)            
unsigned long int:         4294967295  4*sizeof(char)            
unsigned long long int:    4294967295  8*sizeof(char)  //range[0..18446744073709551615]       
unsigned long:             4294967295  4*sizeof(char)            
unsigned long long:        4294967295  8*sizeof(char)  //range[0..18446744073709551615]

使用したソースは次のとおりです。

#include <iostream>
#include <cstdio>

int main(void){

    std::cout << "Type sizes: (multiples of char)"<< std::endl << "char: " << sizeof(char) << std::endl <<\
    "short: " << sizeof() << std::endl <<\
    "short int: " << sizeof(short int) << std::endl << std::endl <<\
    "int: " << sizeof(int) << std::endl <<\
    "long int: " << sizeof(long int) << std::endl <<\
    "long long int: " << sizeof(long long int) << std::endl << std::endl <<\
    "long: " << sizeof(long) << std::endl <<\
    "long long: " << sizeof(long long) << std::endl << std::endl <<\
    "float: " << sizeof(float) << std::endl <<\
    "double: " << sizeof(double) << std::endl;

    unsigned char c = -1;
    unsigned short s1 = -1;
    unsigned short int s2 = -1;

    unsigned int i = -1;
    unsigned long int i1 = -1;
    unsigned long long int i2 = -1;

    unsigned long l = -1;
    unsigned long long l1 = -1;

    printf("\
            \nUnsigned Max:     \n\
            \nchar:             %u\
            \nshort:            %u\
            \nshort int:        %u\
            \nint:              %u\
            \nlong int:         %u\
            \nlong long int:    %u\
            \nlong:             %u\
            \nlong long:        %u\
            ", c, s1, s2, i, i1, i2, l, l1);

    return 0;
}
4

1 に答える 1

1

に間違ったフラグを使用しています。printf値は実際には問題printfありませんが、正しく表示されていません。を試してみて%lluくださいunsigned long long

printf(フラグ)の詳細: http://www.cplusplus.com/reference/cstdio/printf/

于 2013-04-26T17:57:57.577 に答える