【问题标题】:Why s is returning 0 when inputs are 2,3,4?为什么当输入为 2、3、4 时 s 返回 0?
【发布时间】:2015-01-18 07:15:31
【问题描述】:
#include<stdio.h>
#include<conio.h>

void main(){
  int a,b,c;
  float s,area;

  printf("Enter 3 sides of triangle:");
  scanf("%d %d %d",&a,&b,&c);

  s=(a+b+c)/2;
  printf("%d",s);

  area=sqrt(s*(s-a)*(s-b)*(s-c));
  printf("Area of triangle is : %.1f",area);
}

并解释为什么〜0是-1的按位补码运算符?它是如何工作的?

【问题讨论】:

    标签: c floating-point return


    【解决方案1】:

    因为你在做整数除法,试试这个

    s=((float)(a+b+c)) / 2.0;
    

    如果你不投数字

    s = (2 + 4 + 3) / 2 -> 9 / 2 - > 4
    

    然后

    area=sqrt(4*(4-2)*(4-3)*(4-4));
                          /*  ^ this is 0
    

    因此

    area=sqrt(4*2*1*0) -> sqrt(0) -> 0;
    

    正如其他答案已经提到的那样,~ 按位运算符翻转其操作数的位,这意味着如果您有数字 10,它的二进制表示是

    00001010
    ^^^^^^^^   
    11110101
    

    如果你对它应用~ 操作符,它就变成了

    11110101 -> 245 // unsigned
    

    变成245 - 256 = -11,见Two's complement

    【讨论】:

    • 如果我在做整数除法会有什么问题???我将结果存储在浮点数中。我不明白这个概念..你能解释一下吗??
    • 哦,谢谢zzz......我现在明白了......你能解释一下按位补码运算符吗???
    • 那里不需要演员表。
    【解决方案2】:

    为什么当输入为 2,3,4 时 s 返回 0?

    因为您正在进行int 计算。

    并解释按位补码运算符为什么 ~0 是 -1??它是如何工作的????

    假设8位,0为:

    00000000
    

    什么是~0?

    11111111
    

    在二进制补码中它是 -1,因为如果你翻转所有位并将结果加 1,你会得到:

    00000001
    

    由于 MSB 为 1,因此结果为负。

    【讨论】:

    • 二进制补码是数字的一种表示系统,有些会以这种形式存储,有些则不会。
    • 对不起..但我没听懂。
    猜你喜欢
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2011-12-19
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多