在c语言里面 int x=-4; unsigned int y; y=sqrt(x); 结果是0 去掉unsigned,结果是很大的数 原理?

如题所述

第1个回答  2016-07-02
问题1#include#includeintmain(){doublex,x1,x2;/*定义存放结果变量*/doubledelta;/*定义判别式变量*/delta=5*5-4*1*6;if(deltaintmain(){charch='b';inti=3,j=5;floatx=22.354,y=435.6789;printf("ch=\'%c\',ASCII=%d\n",ch,ch);/*‘的输出要加\'*/printf("i=%-6dj=%d\n",i,j);/*-6是左对齐,共占6个位置*/printf("x=%-8.2fy=%.2f\n",x,y);/*-8.2是左对齐,共占8个位置,小数点后2位*/getchar();return0;}追问

能通俗一点吗

第2个回答  2016-07-02
-4的平方根是正负2i,i平方是-1,但这毫无意义,因此在c语言内负数没有平方根,并且sqrt返回的是double值,double是不可用unsigned 修饰的,因此与unsigned 无关。追问

可为什么unsigned输出的是0,没有unsigned输出一个很大的数?

追答

这是你y的问题,sqrt(-4)计算出来的肯定不是一个正确结果,但它却是是有数据的double型呢,从那个去掉unsigned的结果来看,可以看出所得的结果二进制开头是0,因为是负数,因此一个double赋予给一个int型,数据丢失只会剩下第一位。因此有unsigned是0,没有却是一个负数,并且2147483648的二进制是1000 0000 0000 0000呢,明显int都装爆了好吧。

第3个回答  2016-07-02
首先sqrt(-4)的值是未定义的,视编译器而定,多数编译器是返回nan
https://www.zhihu.com/question/35910493

假设这里lz的编译器确实是返回nan,但是当阶码全为 1 时,只要尾数不全为 0 就是 nan,所以nan在不同编译器里又是不同的

所以就你现在给出的信息根本不能做出解答,请贴出具体返回值是多少
第4个回答  2016-07-02
不太可能吧,你用的什么版本的C编译器?追问

visualstudio2015

追答

我试试啊
试了,因为sqrt的原型为double sqrt(double),所以这个函数返回的是浮点数,然后在C语言的浮点数中有NAN的值,也就是代表not a number,不是一个有效数字。因为负数的平方根在实数范围内是无解的,所以在这里就返回NAN,然后再转成int类型就属于一个未定义的操作,返回什么数值都不要意外。

本回答被提问者采纳
相似回答
大家正在搜