当输入为 2、3、4 时,为什么 s 返回 0?
Why s is returning 0 when inputs are 2,3,4?
#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?它是如何工作的?
因为你在做整数除法,试试这个
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。
why s is returning 0 when inputs are 2,3,4?
因为你正在做 int
计算。
and also explain bitwise complement oprator why ~0 is -1??how it works????
假设8位,0为:
00000000
~0 是什么?
11111111
在二进制补码中它是 -1,因为如果您翻转所有位并将结果加 1,您将得到:
00000001
并且由于 MSB 为 1,因此结果为负。
#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?它是如何工作的?
因为你在做整数除法,试试这个
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。
why s is returning 0 when inputs are 2,3,4?
因为你正在做 int
计算。
and also explain bitwise complement oprator why ~0 is -1??how it works????
假设8位,0为:
00000000
~0 是什么?
11111111
在二进制补码中它是 -1,因为如果您翻转所有位并将结果加 1,您将得到:
00000001
并且由于 MSB 为 1,因此结果为负。