c - 指针之间的类型转换。打印错误
问题描述
该程序是用 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 中,从浮点类型到整数类型的转换不是逐位转换。因此,即使i
和f
逐位相同,它们也不会以unsigned int
相同的方式转换为。你看到的是预期的行为。
推荐阅读
- javascript - 为什么我的函数没有在我的 SetInterval 中被调用?
- python - 有没有办法将 2 段非常相似的代码变成一个函数并重复?
- elixir - 如何解决 lib/.../views/user_view.ex:16: undefined function user_path/3 编译错误
- firebase - 如何通过 Firebase 托管部署 Polymer 入门套件 3?
- mongodb - 如何使用golang在mongodb中插入多数组
- clojure - 使用 Clojure 在 Quil 中创建其他 3D 基元
- powershell - 如何使用 PowerShell 取消和删除队列中的等待构建
- python-2.7 - 无法在 Ubuntu 服务器上停用虚拟环境
- java - 尝试在 HTTPCLIENT -JAVA 中发送 POST 请求时,收到 400 Bad Request
- html - 如何修复从 div 元素底部延伸出来的文本