一种类型转换为另一种 C 的类型转换警告
Typecast warning of Conversion of one type to another C
我 运行 在 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)
尝试修复警告,它确实消除了警告,但导致了分段错误。我会 post 我的其余代码,但有很多代码,希望这足以让某人提供一些输入。
我知道我正在将一个 unsigned int 指针分配给一个 unsigned int,考虑到它的大小不同,但我不确定从这里去哪里。
如有任何帮助,我们将不胜感激。
谢谢。
您正试图将指针转换为整数。 C 允许这样做,但它并不经常做你想做的事,在这种情况下,目标类型没有起始类型那么宽,因此转换可能会导致有效数字丢失。这就是编译器警告您的内容。
如果函数参数 vp
是指向您想要的 unsigned int 值的指针,那么您正在寻找
unsigned int i = *(unsigned int *)vp;
也就是说,您将 pointer-to-void 转换为 pointer-to-unsigned int
正如您已经做的那样,然后 取消引用结果 以获得它指向的值到.
另一方面,如果您正在做一些愚蠢的事情,例如将想要的 unsigned int
值本身作为指针值传递,那么您可以简单地忽略该警告。在这种情况下,您的代码可能会按原样运行,警告是您为草率付出的代价。
我 运行 在 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)
尝试修复警告,它确实消除了警告,但导致了分段错误。我会 post 我的其余代码,但有很多代码,希望这足以让某人提供一些输入。
我知道我正在将一个 unsigned int 指针分配给一个 unsigned int,考虑到它的大小不同,但我不确定从这里去哪里。
如有任何帮助,我们将不胜感激。
谢谢。
您正试图将指针转换为整数。 C 允许这样做,但它并不经常做你想做的事,在这种情况下,目标类型没有起始类型那么宽,因此转换可能会导致有效数字丢失。这就是编译器警告您的内容。
如果函数参数 vp
是指向您想要的 unsigned int 值的指针,那么您正在寻找
unsigned int i = *(unsigned int *)vp;
也就是说,您将 pointer-to-void 转换为 pointer-to-unsigned int
正如您已经做的那样,然后 取消引用结果 以获得它指向的值到.
另一方面,如果您正在做一些愚蠢的事情,例如将想要的 unsigned int
值本身作为指针值传递,那么您可以简单地忽略该警告。在这种情况下,您的代码可能会按原样运行,警告是您为草率付出的代价。