关于c语言中计算的问题

unsigned char BUF[6];
int x,y,z;
x=BUF[0] << 8 | BUF[1];
z=BUF[2] << 8 | BUF[3];
y=BUF[4] << 8 | BUF[5];

angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180;

这两个是怎么算的啊?请说的详细点谢了(我完全没有看的懂啊)

unsigned char BUF[6];//运算符优先级问题
int x,y,z;
x=BUF[0] << 8 | BUF[1]; //先将BUF[0]左移八位再将得到的结果与BUF[1]进行或运算,最后的结 果赋予x;
z=BUF[2] << 8 | BUF[3]; //类似
y=BUF[4] << 8 | BUF[5]; //类似

angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180;//先把y和x强转为double类型,
然后将y除以x的值进行反正切预算,得到的结果是一个弧度值,然后乘以(180/3.14159265)转化为角度值,最后加上180度并赋予angle。追问

能请问一下那BUF[0]中的数据是被丢弃了吗?(是不是相当于仅将BUF[1]的值赋值给x)

追答

没有啊 我举个例子吧
这里BUF[0]的类型是unsigned char 型 值的范围是0~255.所以这里的左移指的是逻辑左移。
不知道你对逻辑左移以及算术左移熟不熟悉?这里BUF[0]经过左移八位,对于逻辑左移,左移八位的意思就是乘以256.因为BUF[0]的类型是unsigned char 型,不管它原来的值是多少,当它左移八位后的结果都是0.但是这里的0不是指BUF[0]的值等于0,而是BUF[0]左移八位后的结果等于0,再将这个值与BUF[1]进行或运算,在这个过程中BUF[0]的值始终是保持不变的。
不知道这样讲你理解了没有,如果还不理解的话建议你看一下运算符的优先级以及位运算中的逻辑左移的内容。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-02
unsigned char BUF[6];//运算符优先级问题
int x,y,z;
x=BUF[0] << 8 | BUF[1]; //先算8按位与BUF[1],接着将结果记录为temp(实际不存在,方便叙述),然 后BUF[0]转换成二进制数,接着将这个二进制数字集体左移temp位
z=BUF[2] << 8 | BUF[3]; //类似
y=BUF[4] << 8 | BUF[5]; //类似

angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180;//先把y和x强转为double类型,逗号运算符从左到右计算取最右结果,所以取x,再算180/3.14,结果跟X相乘,最后加180,总结果作为函数atan2的形参,运行atan2函数,将返回值赋值给angle追问

| 不是按位或吗??
而且 | 的优先就是10级而<<是第5优先级的啊?

关于C语言求一串阶乘的和,求高手帮我看一下!
如果在计算20以内的阶乘之和时,使用常规的整型变量,可能会出现计算结果错误的问题。原因在于阶乘之和超过了整型变量的存储上限。例如,计算结果实际为2561327494111820313,而代码输出为268040729。这主要是因为计算过程中数值超过了整型的最大值。解决此问题的方法是使用浮点型变量进行计算,以避免整数溢出。实...

C语言计算税收,程序有问题,下面是代码,scanf提示错误。
在C语言中,编写计算税收的程序时,可能会遇到诸如"scanf"提示错误的问题。为了确保程序的正确运行,理解并正确使用语法至关重要。这里有一个关于税收计算的代码示例,其中涉及到表达式的书写错误。原代码中,有如下表达式:`elseif(1000>x>=5000)`。这个表达式的写法在C语言中是不正确的。正确的形式应为...

C语言计算结果出错的原因?
1、数组越界 调用数组元素时使用的索引号超过数组所能提供的索引号的范围。2、未考虑到运算中被除数为0的情况 目前未遇到。3、堆栈溢出(stark overflow)触发原因:(1)变量申请大空间内存(2)递归 解决办法细分:(1)增大栈空间 修改 属性->链接器->系统 中 “堆栈提交大小” “堆栈保留大小” ...

C语言矩阵求和 求积问题
为了计算矩阵中的元素和以及特定条件下元素的乘积,可以使用C语言编写如下的程序。在这个示例中,我们使用了一个5x5的矩阵,并计算了对角线上元素的和以及对角线上行列下标为偶数的元素的乘积。首先,我们需要包含C语言的标准输入输出头文件`stdio.h`,以便使用`printf()`和`scanf()`函数。接下来,定义...

怎么利用C语言实现数学问题计算
1、首先在Visual Studio 2019中新建一个C语言文件,如下图所示。2、接着导入如下图所示的库文件,所需要的数学计算函数都在里面。3、然后运用scanf函数来接收用户输入的三个数字,如下图所示。4、接着利用逐个比较的方式计算三个数中的最大值,如下图所示。5、运行编写的C语言文件,会弹出如下图...

C语言计算负数取余的问题,如何解决?
C语言计算负数取余:符号内的被除数决定,就是计算式中的-7,7,-7决定:比如-7%5=-2;7%-5=2;-7%-5=-2;负数取余的原理:任何一个整数n都可以表示成n=k*q+r其中0<=|r|<|q|这里的r就是n除以q的余数,即r==n%q例如:-9=(-2)*4+(-1)则-9除以4的余数为-1。求余:取...

c语言问题如图:sizeof计算的结果是7吗?因为最后有\\0,这样计算的结果不就...
sizeof求的是变量所占内存的字节数。题中结果是7,表示数组的大小,6个可显示字符加结束符\\0。如果要求字符串长度可以使用strlen(charArr)库函数。

C语言中除了使用函数pow实现乘方运算,还有什么方法?
1、C语言中计算一个数的N次方可以用库函数pow来实现,还可以直接使用2^3就可以算出结果。pow函数原型:double pow(double x,double y)。其中x值是底数,y值是幂。举例:double a=pow(3.14,2)计算3.14的平方。注意:使用pow函数时,需要将头文件#include<math.h>包含进源文件中。2、在C语言...

C语言运算问题
a=a-(a*=a))继续 a=a+(a=a-(a=a*a)) 计算得a=0 原因是:a=a*a=144 这时把144赋值给a了,a=a-(a=a*a)这一步里,a=144-144=0,把0赋值给a,a=a+(a=a-(a=a*a))=0+0=0.这几个题要注意一下括号的优先级,还有主要是表达式的化解问题,有什么不懂的再问我吧。。

C语言关于计算问题,急a
因为执行到t=++x||++y时,先执行++x,||运算左边为4,因为4是非零,所以表达式++x||++y的值恒为1,所以||运算就不执行右边,所以y=3.

相似回答