【发布时间】:2014-08-07 04:21:16
【问题描述】:
对于初学者来说,我的主要目标是在 64 位环境中将 unsigned long 转换为 unsigned int(并且在没有任何编译警告的情况下执行此操作)。这可以通过这个函数轻松完成:
unsigned int a_to_b(unsigned long a)
{
return((unsigned int)(a));
}
虽然它给出了正确的结果,但问题是在 64 位环境中它会在编译时抛出警告:
1506-742 (I) 64 位可移植性:通过将 unsigned long int 类型转换为 unsigned int 类型可能会丢失数字。
为了绕过这个警告,我们尝试了这个函数:
unsigned int a_to_b(unsigned long a)
{
unsigned int b;
int skip = sizeof(unsigned long) - sizeof(unsigned int);
memcpy(&b, (&a)+skip, sizeof(b));
return(b);
}
现在这在编译时不会给出任何警告,但它不会给出正确的输出。 我在 32 位编译器中尝试了相同的代码,它工作正常。
请建议如何纠正 memcpy 的这种行为或任何其他绕过警告的方法。
【问题讨论】:
-
您是否考虑过
long可能比int更长的可能性? -
你用的是什么编译器?
return a;上的警告不会让我感到惊讶,但我会惊讶地看到像return (unsigned int)a;这样的明确案例的警告。一个演员对编译器说“相信我,我知道我在做什么。” -
您知道您可以使用
#pragma抑制编译器警告吗? stackoverflow.com/questions/6440614/disable-warning-in-msvc2010 -
我很惊讶每个人都忽略了这里明显的 XY 问题。 :)
-
void main()在 Unix 和 AIX 上是无条件错误的。您从int *得到 0,因为 465287295 是 0x1BBBB87F(32 位值),并且在运行 AIX 的大端机器上,高位 4 字节(对于显示的值全为零)是存储在低位 4 字节之前。
标签: c