0

编辑:愚蠢的问题,我忽略了格式标识符。

我有一个程序获取一些无符号类型的大小及其最大值。这引起了我的注意,甚至认为unsigned long long是 8 个字节的事实,它的范围似乎固定为 4 个字节的范围。(char 是保证的 8 位字节)


我理解的问题unsigned long long仅由标准定义为至少足够大以容纳int(或者更确切地说 >= long int>=可int传递)。但是,为什么它使用 8 个字节的内存,而不是像int它也被限制在 4 个字节的范围一样大小?

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 回答