【问题标题】:assigning a value to a long long integers using gcc on sparc solaris在 sparc solaris 上使用 gcc 为 long long 整数赋值
【发布时间】:2012-02-27 15:41:08
【问题描述】:

我遇到了一些我认为很奇怪的事情。测试程序

int main(int argc, char* argv[])
{
    cout<<"hello"<<endl;
    long unsigned l = 0x12345678;
    long long unsigned ll =  0x12345678;
    cout<<sizeof(l)<<endl;
    cout<<sizeof(ll)<<endl;
};

输出是:

hello    
4    
8

那里没有惊喜。 long int 的大小为 4 个字节,long long 的大小为 8 个字节。 但是,当我更改它以便分配 long long 时

long long unsigned ll =  0x123456789;

在编译时我得到

error: integer constant is too large for "long" type

现在,如果我使用选项 -m64 强制进行 64 位构建,那么同样的测试编译。我做错了什么还是这是 GCC 中的错误?

【问题讨论】:

    标签: c++ gcc solaris sparc long-long


    【解决方案1】:

    改成

    long long unsigned ll = 0x123456789ULL; // notice the suffix
    

    没有后缀,文字大于您机器上的最大 unsigned long 值,并且根据 C++03(但不是 C++11,它具有 long long),这是未定义的行为。这意味着任何事情都可能发生,包括编译时错误。

    在 C++03 中没有 long long 也是毫无价值的,所以它不能保证工作,你依赖于一个扩展。你可能最好改用 C++11。

    【讨论】:

      【解决方案2】:

      这里的事情是,很多人似乎在看一行代码,就像你的:

      unsigned long long ll = 0x123456789;   /* ANTI-PATTERN! Don't do this! */
      

      并且原因“哦,类型是 unsigned long long,所以值是 unsigned long long 并且它被分配”,但这不是 C 的工作方式。文字有自己的类型,这不依赖于它们被使用的上下文。并且整型字面量的类型是int

      这与人们所做的谬误相同:

      const double one_third = 1 / 3;   /* ANTI-PATTERN! Don't do this! */
      

      认为“左边的类型是double,所以应该分配0.3333333...”。这只是(再次!)不是 C 的工作方式。被划分的字面量类型仍然是int,所以右边的计算结果正好为0,然后将其转换为double并存储在one_third变量中。

      由于某种原因,这种行为对很多人来说是非常不直观的,这就是为什么同一个问题会有很多变体。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-07
        • 2020-11-11
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-02
        相关资源
        最近更新 更多