首页 > 解决方案 > 指针之间的类型转换。打印错误

问题描述

该程序是用 C 语言编写的。

我们确定变量 i 和 f 中包含的值具有相同的位序列。现在转到程序的第 63 行。我创建了 unsigned int 类型的变量 ui 和 uf。我将转换为无符号整数的 i 的值分配给 ui。我将转换为 unsigned int 的 f 的值分配给 uf。我的问题是:为什么当我打印 ui 和 uf 的内容时会得到两个不同的值?(ui = 3281948672 uf = 4294966979)。考虑到 i 和 f 中包含的值具有相同的二进制表示,ui 和 uf 的打印不应该给我相同的值吗?那是 3281948672。这很奇怪,因为当我打印指向 i 和 f 的 *ipi 和 *ipf 的内容时,它们给了我相同的结果(*ipi = 3281948672 *ipf = 3281948672)。帮我!

这是源代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{

float f = -317.125;
int i = -1013018624;

printf("Value : %f  %d\n",f,i);
printf("Indexs: %p  %p\n",&f,&i);

if(i == f)
{
    printf("equals\n");
}
else
{
    printf("Differents\n");
}

float* pf = &f;
int* pi = &i;

printf("float *pt %p, int *pi  %p\n",pf,pi);

if(*pi == *pf)
{
    printf("*pt and *pi equals\n");
}
else
{
    printf("differents\n");
}

void* vpf = &f;
void* vpi = &i;


unsigned int *ipf = (unsigned int *)vpf;
unsigned int *ipi = (unsigned int *)vpi;


if(*ipf == *ipi)
{
    printf("*ipf e *ipi are equals why the bits contained in the pointed memory areas are the same\n");
}
else
{
    printf("differents\n");
}

printf("*ipi = %u\n",*ipi);
printf("*ipf = %u\n",*ipf);
printf("*ipi in hex = %08X\n",*ipi);
printf("*ipf in hex = %08X\n\n\n",*ipf);






unsigned int ui,uf;
ui = (unsigned int)i;
uf = (unsigned int)f;
printf("ui = %u\n",ui);
printf("uf = %u",uf);



return 0;
}

标签: c

解决方案


在 C 中,从浮点类型到整数类型的转换不是逐位转换。因此,即使if逐位相同,它们也不会以unsigned int相同的方式转换为。你看到的是预期的行为。


推荐阅读