【问题标题】:Size in bytes for literals字面量的字节大小
【发布时间】:2014-03-01 02:19:07
【问题描述】:
What is the size (in bytes) for each of the literals '7', 7.0, “7”?

我的任务是处理这个问题,老实说,我不知道如何找到这些字节的大小。有人能指出我正确的方向吗?

【问题讨论】:

  • 要算出字节数,需要确定每个字节是什么类型。列出了 3 种不同的类型。
  • 请注意,第二个可能会有所不同。

标签: c++ visual-c++ byte literals


【解决方案1】:

一种方法是使用 sizeof 运算符。

例如,

#include <iostream>
#include <math.h>

int main(int argc, char **argv)
{
    std::cout << "size of char 6 is " << sizeof('6') << std::endl;
    std::cout << "size of float 6.0 is " << sizeof(6.0) << std::endl;
    std::cout << "size of string 6 is " << sizeof("6") << std::endl;

    return 0;
}   

【讨论】:

  • 浮动文字是双精度的,除非它们有后缀。
【解决方案2】:

为了教你如何钓鱼而不是给你一条鱼,让我们把它分成两部分。首先我们如何找到这些文字的类型,typeid 非常适合这个问题:

#include <typeinfo>
#include <iostream>

int main()
{
    std::cout << typeid( '7' ).name() << std::endl ;
    std::cout << typeid( 7.0 ).name() << std::endl ;
    std::cout << typeid( "7" ).name() << std::endl ;
}  

我们使用的是clang,所以输出如下(see it live):

c
d
A2_c

Visual Studio 中你会直接得到类型(see it live

如果我们必须demangle,我们会使用c++filt -t,我们会看到:

char
double
char [2]

现在我们知道了类型,我们可以使用 sizeof 找到它们的大小:

#include <typeinfo>
#include <iostream>

int main()
{
    std::cout << sizeof( char)  << std::endl ;
    std::cout << sizeof( double )  << std::endl ;
    std::cout << sizeof( char [2] ) << std::endl ;
}   

对我来说结果是:

1
8
2

【讨论】:

  • decltype 可能比typeid 更好。此外,您可以(正如您显然知道的那样)只使用 sizeof 中的文字。
  • @Rapptz 它们是探索的工具,对于刚刚弄清楚这一点的人来说,使用sizeof 并没有给他们太多。当然要真正理解最好转到标准部分2.14 Literals 并从那里开始。
【解决方案3】:

为了迂腐,一般情况下文字本身没有物理大小。将“以字节为单位的大小”的概念应用于非“物质”的东西是没有意义的,即不驻留在内存中。这里唯一的例外是字符串文字"7",它是一个左值。同时,'7'7.0 不是左值。

无论如何,当您将sizeof 应用于文字值时(如果这就是您所说的“以字节为单位的大小”),文字将被解释为一个简单的表达式。你得到的是表达式所具有的 type 的大小。因此,'7' 具有类型 char 和大小 1,7.0 具有类型 double 和大小 sizeof(double)(取决于实现),"7" 具有类型 const char[2] 和大小 2。

(请注意,数组到指针的转换不适用于sizeof 的直接操作数,这就是为什么sizeof "7" 计算为数组大小而不是指针大小的原因。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多