我正在阅读关于SO的this问题。在阅读第一个答案后,我无法理解-5 >> 1 = -3
的原因。我也围绕它做了一些调整。划分和移位之间的区别
您也可以看到代码并输出here。 这里是我做过什么:
#include<stdio.h>
int main(){
printf("5/2 = %d\n",5/2);
printf("5 >> 1 = %d\n",5 >> 1);
printf("5/2 = %lf\n",5/2);
printf("5 >> 1 = %f\n",5 >> 1);
printf("-5/2 = %d\n",-5/2);
printf("-5 >> 1 = %d\n",-5 >> 1);
printf("-5/2 = %f\n",-5/2);
printf("-5 >> 1 = %f\n",-5 >> 1);
return 0;
}
输出:
5/2 = 2
5 >> 1 = 2
5/2 = 2.168831
5 >> 1 = 2.168831
-5/2 = -2
-5 >> 1 = -3
-5/2 = 2.168833
-5 >> 1 = 2.168833
我无法理解5/2 == 2.168831, 5 >> 2 == 2.168831, 5 >> 1 == -3
。
为什么发生这种情况?(这可能是答案是非常基本的,我错过了一些基本的东西,所以请指导我)。
C11最终草案,第6.5.7节:“ * E1 >> E2的结果是E1向右移位的E2位置......如果E1有符号类型和负值,则结果值为实现定义*“C11最终草案,§7.21.6.1: “*如果转换规范无效,则行为是未定义的。如果任何参数不是相应转换规范的正确类型,则行为未定义。*” – DCoder