数据类型的限制

时间:2016-01-14 06:01:36

标签: c++ type-conversion

以下代码为某些值打印错误输出,而其他值正确。 例如,699838110的输出是2938640281442109880,而应该是2938640272852175288

#include <iostream>
#include<cmath>
using namespace std;

int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        int d;
        cin>>d;
        if(d==1)
        {
            cout<<1<<endl;
        }
        else
        {
            long long int y=pow(d,2);
            long long int x=8+6*y-12*d;
            cout<<x<<endl;
        }
    }
    return 0;
}

这是否因为数据类型的限制而发生长long int? 如果不是定义x,我会立即在我的cout语句中写入8 + 6 * d * d-12 * d,然后生成一个垃圾值。这是否意味着cout语句有限制。如果是,那么该限制是什么,还是由计算中涉及的变量的数据类型决定的?

3 个答案:

答案 0 :(得分:2)

12*d将计算为int,而不是long long int。事实上,它在一个更大的表达式中产生long long int并不会改变它。

如果int为32位,则12*d将溢出。这是未定义的行为。实际上,int不需要表示大于32767的值,即使32位整数(能够保存大约2147483647左右的值)在实践中更常见。 / p>

所以你的问题与流的限制无关。它与表达式中的变量和结果类型有关。

答案 1 :(得分:2)

pow(d,2)表达式 - 使用std::pow - 涉及浮点计算(可能IEEE floating pointd转换为double,因此53位尾数)。阅读http://floating-point.de/

最好避免这样做并做:

  long long int y= d*d;

甚至更好

  long long int y = ((long long)d)* d;

使得平方发生在64位算术中 这可能会更快,更准确。

顺便说一句,你应该编译所有的警告&amp;调试信息(g++ -Wall -Wextra -g如果使用GCC ...)并在调试器(gdb)中逐步运行您的程序。这肯定会帮助你自己找到这个bug。

答案 2 :(得分:1)

尝试以下方法。我认为“d”变量需要很长时间。

class Jukebox {

    private Song[][] songList;

    public Jukebox() {

        songList = new Song[3][4];

        songList[0][0] = new Song("Jet Airliner", 5);
        songList[0][1] = new Song("Slide", 4);
        songList[0][2] = new Song("Tom Sawyer", 3);
        songList[0][3] = new Song("Purple Rain", 2);

        songList[1][0] = new Song("Sing a Song", 1);
        songList[1][1] = new Song("Baba O'Riley", 5);
        songList[1][2] = new Song("Jumper", 4);
        songList[1][3] = new Song("Car Wash", 3);

        songList[2][0] = new Song("Kung Fu Fighting", 2);
        songList[2][1] = new Song("Right as Rain", 4);
        songList[2][2] = new Song("Beat It", 5);
        songList[2][3] = new Song("Bust a Move", 4);
    }


    public String toString() {
        String output = " ";
        for (int row = 0; row < songList.length; row++) {
            for (int col = 0; col < songList[row].length; col++) {
                output += (songList[row][col]);
            }
            output += "\n";
        }
        return output;
    }    
}

信用:@Basile Starynkevitch