feixiang1990 发表于 2013-2-2 10:52:25

C语言强制类型转换的疑惑

谁能告诉我cmd =(unsigned char)-1 ;cmd的值为多大? cmd的定义类型为unsigned char
也请求高人,讲解一些与强制类型转换的知识。

cqfeiyuxmj 发表于 2013-2-2 10:58:51

cmd=0xFF   

snoopyzz 发表于 2013-2-2 11:03:21

2L正解,显然是0xff

feixiang1990 发表于 2013-2-2 11:22:01

cqfeiyuxmj 发表于 2013-2-2 10:58 static/image/common/back.gif
cmd=0xFF

有个问题啊;
float f= 5.75;
那么(int)f 是多少呢?
强制类型转化的规则是什么?
顺便再问一下:
(unsigned char) -2 多少呢?

snoopyzz 发表于 2013-2-2 11:27:29

feixiang1990 发表于 2013-2-2 11:22 static/image/common/back.gif
有个问题啊;
float f= 5.75;
那么(int)f 是多少呢?


(int)f = 5;
(unsigned char)(-2) = 0xfe

yoz 发表于 2013-2-2 11:28:00

本帖最后由 yoz 于 2013-2-2 11:53 编辑

(编辑原因:补回我错误的思路,提出疑问,也消除话没说清楚引起的误会)
5.75就是101.11,也就是1.0111*2^10,对应应该是0 10000001 0111 0000 0000 0000 0000 000,对应的int应该是1085800448
(但是读出却是0,于是我做了实验)
/********************/
#include <stdio.h>

int main(void)
{
    float a = 5.75;
    int b;
    b = (int)a;
    printf("%d\n" , b);
    printf("%d\n" , a);//我故意试验两种方法的,在工作中不可能做这么2的事
    return 0;
}
/********************/
才明白
(int)5.75==5

float a=5.75;
printf("%d\n",a);
会输出0
我之前对c理解的还是不到位
现在还是有疑惑,为什么用%d会输出0而不是1085800448?难道是大小端?我还不明白

snoopyzz 发表于 2013-2-2 11:41:02

yoz 发表于 2013-2-2 11:28 static/image/common/back.gif
刚才说错了,(int)5.75==0

float a=5.75;



float a=5.75;
printf("%d\n", (int)a);

肯定结果是5


你输出0是因为没加强制类型转换

效果等同于*(int*)&a, 而不是(int)a

asdf1776 发表于 2013-2-2 11:42:28

yoz 发表于 2013-2-2 11:28 static/image/common/back.gif
刚才说错了,(int)5.75==0

float a=5.75;


%d怎么能和float连用?
你这种写法在我公司会被罚款

yoz 发表于 2013-2-2 11:43:43

本帖最后由 yoz 于 2013-2-2 11:53 编辑

snoopyzz 发表于 2013-2-2 11:41 static/image/common/back.gif
float a=5.75;
printf("%d\n", (int)a);



是的,(int)5.75==5,而直接printf就是0,谢谢提醒,不然我就不会发现自己错了,实践出真知。

yoz 发表于 2013-2-2 11:44:24

本帖最后由 yoz 于 2013-2-2 11:46 编辑

asdf1776 发表于 2013-2-2 11:42 static/image/common/back.gif
%d怎么能和float连用?
你这种写法在我公司会被罚款

只是故意看看这种不匹配的后果{:sweat:}
(补充)
我本来以为按照ieee754存储的float也是32位,能否在printf中用%d来强制把这四个字节当作int来输出,结果好像并不如我所愿。

feixiang1990 发表于 2013-2-2 11:53:08

谢谢 大家 虽然还是有点小疑惑,不过还是很感谢大家,看来只能回家看课本了

yoz 发表于 2013-2-2 11:55:17

我也是,还需要多学习,谢谢各位指点。

i_kkyu 发表于 2013-2-2 13:51:19

feixiang1990 发表于 2013-2-2 11:53 static/image/common/back.gif
谢谢 大家 虽然还是有点小疑惑,不过还是很感谢大家,看来只能回家看课本了 ...

先理论分析。然后机器验证一下。

yoz 发表于 2013-2-3 10:22:09

本帖最后由 yoz 于 2013-2-3 10:29 编辑

我又做了一个实验,看来float转换为int也因机器而已,在windows的vc6上,以下程序测试结果是
5.000000
#include <stdio.h>

func(void)
{
        return 5.75;
}

int main(void)
{
    float f;
        f = func();
        printf("%f\n" , f);
    return 0;
}
但是在sparc机上,按照C与指针的说法是这样的

说明了这个问题意义不大

(补充总结)
用%d输出float的方法去做“强制类型转换”是无意义的
用(int)转换float则是做小数截断
用(float)转换int则是加小数点

takashiki 发表于 2013-2-3 11:39:06

yoz 发表于 2013-2-3 10:22 static/image/common/back.gif
我又做了一个实验,看来float转换为int也因机器而已,在windows的vc6上,以下程序测试结果是
5.000000
#inc ...

int和float/double之间的转换是会调用转换函数的,因为类型不兼容。
char、short、int、long、long long/int64以及它们的unsigned版本转换是不需要调用转换函数的,因为类型是兼容的。
同样,C++专门有转换函数的概念,只不过并不以函数的形式表现,而是以操作符重载的形式体现。

至于你6楼所说的%d会输出0而不是1085800448是因为变量存储的地址不一致所引起的,而不是大小端。float会使用FPU,很遗憾,%d不访问FPU,它所访问的寄存器根本就不是float所使用的寄存器,所以输出一个无法确定的值。孟子曰:以若所为(float所在的FPU寄存器),求若所欲(%d所用的CPU寄存器),犹缘木而求鱼也。

yoz 发表于 2013-2-3 11:45:45

takashiki 发表于 2013-2-3 11:39 static/image/common/back.gif
int和float/double之间的转换是会调用转换函数的,因为类型不兼容。
char、short、int、long、long long/ ...

谢谢你的指教,暴露出了我对计算机组成原理缺乏了解,我接下来会继续看一些相关的资料,学一点汇编。
页: [1]
查看完整版本: C语言强制类型转换的疑惑