收录日期:2020/07/08 21:40:14 时间:2016/06/07 20:54:56 标签:C语言
以前一直以为除法和位移是一样的,可是看一下这个程序
#include <stdio.h>

int main( void )
{
    printf("%d\n%d\n%d\n%d\n", 3/2, 3>>1, (-3)/2, (-3)>>1);
    system("pause");
    return 0;
}
结果是
1
1
-1
-2
负数时除法与位移的结果不同
位移的实现我知道,-3是101,(-3)>>1就是10,也就是-2
那除法是怎么样?
错了,-3不是101,-3是3的补码,楼主应该先去看看微机原理。。
to 楼上的,偶对这些概念的名称不是很懂。。
但是-3的二进制补码就是101,机器内部也是用二进制补码的,是吧?
你可以看一下这个
#include <stdio.h>
typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, int len)
{
    int i;
    for (i = 0; i < len; i++)
        printf(" %.2x", start[i]);
    printf("\n");
}

void show_int(int x)
{
    show_bytes((byte_pointer) &x, sizeof(int));
}

int main( void )
{
    show_int( -3 );
    system("pause");
    return 0;
}
输出 fd ff ff ff
因为是小端的,所以应该是ff ff ff fd
也就是101
这样子不对吗?
ff ff ff fd == 101?
-3的补码的后三位确实是101;
-2的补码的后三位是110;




ff ff ff fd == 101?
=====================
ff ff ff fd ==>> 11111111 11111111 11111111 11111101 ==>> 101
不是吗
-3的补码的后三位确实是101;
-2的补码的后三位是110;
======================
110就等于10,跟我一开始说的一样啊
偶就是想知道除法在c中是如何实现的
我对 (-3)>>1 的理解
-3==11111101.0000
(-3)>>1==11111110.1000
也就是-2+0.5=-1.5
但是结果保存为整数,导致精度丢失。
正数和负数移位的差别,只在于移位后的高位是补0还是补1。
其实右移和除法是有区别的:(以下以x/y为例)y = pow(2,m)
    对于x>=0,右移会和除法的值相等。
    对于x <0 右移合和除法有‘偏置’,可以通过修正达到正确的值:我们在右移之前,先将x加上pow(2,k)-1,就可以达到正确的舍入结果,
x/y = (x < 0? (x + (1<<m)-1):x)>>m
竟然没看到猩猩~~ 我也来猜猜:

在计算机中,数字都是存储其补码; 正数的补码和原码一样的,但是负数的补码就不一样了。
所以对负数移位,就和除法不一致了。

/为取整除法,会自动舍弃尾数的……

新手向各位高手請教一個有關窗口繼承問題 Delphi里类似left, mid, right的函数是什么来着,一时忘了,谢谢... 在线等待!sql语句 我弄的一个论坛和网站,大家去看看 有南方高科的或南方高科出来的请进(高分相送) 哪个哥们知道法国的ip段,解决立即给分 怎样在OpenGL里绘制一个多边形,使其两面显示指定的不同颜色? CList问题 各位大侠想想办法了! 如何让按钮不接受onClick事件 css的定位问题! nokia的fullCanvas可以画梯形吗? 求求求,俺上有老,下有小,一个事关全家人小康的问题!!!!!!!!!! 请问谁知道windows xp 英文专业零售版的序列号?谢谢了,在线等! DBGrid显示数据问题? DataGrid 内置的 CheckBox,分页后,如何取得正确的项号? 奇怪:帖子已结,却无人得分,BUG 如何控制Label换行为题,急~~!!!!! 敏捷到底和快速原型有什么差别? IIS 500错误 系统设计问题(急!!在线等待) 怎样得到本次插入记录的id 号!。。。 修改SA密码时出现错误提示 怎样在WIN2003上安装WSAD5。1??????????????? 关于两表查询主关键字的问题 这里有没有人了解 成都华为的??? java.lang.reflect.Field 中的get(Object obj)参数是什么含义? 问题一个 新手问题 新手提问,请问 TRACE() 函数是做什么用的 ?参数又是什么意思?