将一种类型转换为另一种类型的类别警告

时间:2015-08-04 03:40:42

标签: c unsigned-integer typecast-operator

我在gcc编译器中遇到警告,如下所示:

thread_primes.c(295): warning #810: conversion from "unsigned int *" to "unsigned int" may lose significant bits
        unsigned int i = (unsigned int*) vp;
                     ^

它正在发生的功能是:

void *elim_composites(void *vp)
{
    //*((unsigned int*) vp)
    unsigned int i = (unsigned int*) vp;
    unsigned int min = i * (max_prime / num_threads) + 1;
    /* If we're on the last thread, set the max equal to the max_prime */
    unsigned int max =
        (i ==
         num_threads - 1) ? max_prime : min +
        (max_prime / num_threads) - 1;
    unsigned int j;
    unsigned long k;    //This is much faster as long as opposed to unsigned int
    j = 1;
    while ((j = next_seed(j)) != 0) 
    {
        for (k = (min / j < 3) ? 3 : (min / j); (j * k) <= max;
             k++) 
        {
            set_not_prime(j * k);
        }
    }
    pthread_exit(EXIT_SUCCESS);
}

我已经尝试((unsigned int*) vp)尝试修复警告,它确实摆脱了警告但导致了分段错误。我会发布我的其余代码,但有很多代码,希望这足以让某些人提供一些意见。

我知道我正在为unsigned int分配一个unsigned int指针,考虑到它的大小不一样,但我不知道从这里去哪里。

任何帮助都将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:2)

您正在尝试将指针强制转换为整数。 C允许这样做,但它通常不会做你想要的,在这种情况下,目标类型不像起始类型那么宽,因此转换可能会导致有效数字的丢失。这就是编译器警告你的内容。

如果函数参数vp是指向你想要的unsigned int值的指针,那么你正在寻找

unsigned int i = *(unsigned int *)vp;

也就是说,你将指针指向void转换为指针指向 - unsigned int正如你已经做的那样,然后取消引用结果以获得它指向的值。

另一方面,如果你正在做一些愚蠢的事情,比如传递想要的unsigned int值本身就好像它是一个指针值,那么你可以简单地忽略警告。在这种情况下,您的代码可能会按原样运行,警告是您为草率而付出的代价。