收录日期:2019/12/16 12:52:08 时间: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
竟然没看到猩猩~~ 我也来猜猜:

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

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

SQL SERVER 2005 安装 如何用JAVA编写这样的ORACLE存储过程 关于Symbian创建控件的问题 一个不知道怎么写的表内联sql语句,请教! c++编成中如何将编辑框中的数据读入数据中 欢迎各位WM开发人员前来参加第五届MobileDev Day asp.net成员资格管理的超奇怪问题 myeclipse无法创建Filter和Listener ULONG 怎麽返回-1 套接字 打印本地IP 哪位知道? Java做的bs项目中有个更新模块应该怎么做 struts1.x 的问题 数据库查询问题 我想做DBA,但不知道如何开始啊 结构体输入数据问题 关于.net中回送的问题 SQL 排序问题 新手求教,推荐书。 无盘工作站实现问题讨论 能否在ToolBar上添加Button? vhdl 实现 一段时间过后撤销输出??????? 比较菜的问题 VC6.0中,如何实现CEdit::SetCueText的效果? string赋值问题 Java里的Random 可以数字随机,如何A-Z的字母随机 一个关于进度显示的问题。 急:请教VC遍历ACCESS数据库所有表内的字段名称的问题 各位高人,小弟初学,现在想搭个环境,但有如下问题,帮助解决一下,谢谢。 在2003系统下配置过HTTPS服务的朋友进来下 急:请教关于VC遍历ACCESS数据库各个表内所有字段名称的问题