C无符号长-长错误计算

C无符号长-长错误计算,c,C,我甚至不知道如何命名这个问题,因此首先我将介绍一些代码: void hsvm2dcd72f(const hsvm_t *src, dcd72f_t *result, unsigned long long range) { int h, s, v; int kh, ks, kv; int i; int indexes[72]; int values[72]; unsigned long long sum = 0; unsigned long

我甚至不知道如何命名这个问题,因此首先我将介绍一些代码:

void hsvm2dcd72f(const hsvm_t *src, dcd72f_t *result, unsigned long long range)
{
    int h, s, v;
    int kh, ks, kv;
    int i;
    int indexes[72];
    int values[72];
    unsigned long long sum = 0;
    unsigned long long temp = 0;

    for (i = 0; i < 72; i++)
    {
        result->values[i] = 0;
        values[i] = 0;
    }

    for (i = 0; i < src->length; i++)
    {

        h = (int) src->content[i].h;
        s = (int) src->content[i].s;
        v = (int) src->content[i].v;

        // kwantyzacja H
        if ((h >= 316) || (h < 20))
            kh = 0;
        else if ((h >= 20) && (h < 40))
            kh = 1;
        else if ((h >= 40) && (h < 75))
            kh = 2;
        else if ((h >= 75) && (h < 155))
            kh = 3;
        else if ((h >= 155) && (h < 190))
            kh = 4;
        else if ((h >= 190) && (h < 270))
            kh = 5;
        else if ((h >= 270) && (h < 295))
            kh = 6;
        else if ((h >= 295) && (h < 316))
            kh = 7;

        // kwantyzacja S
        if ((s >= 0) && (s <= 20))
            ks = 0;
        if ((s > 20) && (s <= 70))
            ks = 1;
        if ((s > 70) && (s <= 100))
            ks = 2;

        //kwantyzacja V
        if ((v >= 0) && (v <= 20))
            kv = 0;
        if ((v > 20) && (v <= 70))
            kv = 1;
        if ((v > 70) && (v <= 100))
            kv = 2;

        values[9 * kh + 3 * ks + kv]++;
    }

    quicksorti((int*) &indexes, (int*) &values, 72);

    //norm
    for (i = 72 - 8; i < 72; i++)
        sum += (unsigned long long) values[indexes[i]];

    unsigned long long temp1 = 65535;
    temp = (unsigned long long) range;
    if(temp == temp1)
        printf("ok");
    for (i = 72 - 8; i < 72; i++)
    {
        result->values[indexes[i]] = values[indexes[i]]*temp1 / sum;
    }
}

struct dcd72f // result struct
{
    unsigned long long values[72]; /**< dcd descriptor values. */
};
typedef struct dcd72f dcd72f_t;
比较后显示ok,所以temp1和temp相等,这是我的目标,但是根据变量,我在result->values[index[I]]中得到了不同的结果,temp和temp1。temp1的结果是正确的,但我需要temp的灵活性

我在Windows上使用GCC和eclipse。你知道怎么解决这个问题吗

编辑:
printf%llu\n,温度;和printf%llu\n,temp1;两者都返回65535…

您从未在一个条件下比较过两个浮动。一个范围内的实数是无限的,而浮点数则不是。它有无限的空格,它们给你一个近似值。比较器==为二进制级别。这一定是你的问题。

结果如何分配?有没有可能您正在占用一些内存并覆盖temp?@mlodziaszka什么是range?struct dcd72f您不显示值[]正在初始化的数组;不显示正在初始化的索引。不显示作为结果类型的结构类型的定义。您没有显示如何计算总和。您不显示范围是如何计算的。那是很多缺失的信息。当您添加信息时,请编辑问题而不是添加评论@FatalError老实说,我不认为temp被覆盖了,因为它与上面使用它的temp1行相同,正如我所说的,它们都返回相同的数字。