鱼C论坛

 找回密码
 立即注册
查看: 2817|回复: 7

[已解决]二进制移位

[复制链接]
发表于 2022-6-18 23:01:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

int main()
{
        int a = -20, b;
        for (int i = 1; i <= 7; i++)
        {
                b = a << i;
                printf("%d<<%d位后为:%d\n", a, i, b);
        }

}

********************************

-20<<1位后为:-40
-20<<2位后为:-80
-20<<3位后为:-160
-20<<4位后为:-320
-20<<5位后为:-640
-20<<6位后为:-1280
-20<<7位后为:-2560

C:\Users\lenovo\Desktop\Project1\x64\Debug\Project1.exe (进程 5608)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
***************************************
问题:   -20的二进制为 1001 0100
按理说左移应该是  1010 1000     -40
                            1101 0000     -80
                            1001 0000     -32 ****
移到第三位不该是-32,这个咋这么智能。



最佳答案
2022-6-19 00:42:54
  1. (gdb) l
  2. 1        #include <stdio.h>
  3. 2       
  4. 3        int main(void) {
  5. 4            short a = -20;
  6. 5            short b = a >> 3;
  7. 6            return 0;
  8. 7        }
  9. (gdb) print a
  10. $12 = -20
  11. (gdb) print /x a
  12. $13 = 0xffec
  13. (gdb) print /t a
  14. $14 = 1111111111101100
  15. (gdb) print b
  16. $15 = -3
  17. (gdb) print /x b
  18. $16 = 0xfffd
  19. (gdb) print /t b
  20. $17 = 1111111111111101
  21. (gdb)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-6-18 23:04:57 | 显示全部楼层
本帖最后由 她与晚风 于 2022-6-18 23:06 编辑


#include<stdio.h>

void main()
{
        int a = 20, b;
        for (int i = 1; i <= 3; i++)
        {
                b = a >> i;
                printf("%d>>%d位后为:%d\n", a, i, b);
        }
}


20>>1位后为:10
20>>2位后为:5
20>>3位后为:2

C:\Users\lenovo\Desktop\Project1\x64\Debug\Project1.exe (进程 30684)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .



这个就精度丢失了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-18 23:21:10 | 显示全部楼层
本帖最后由 jackz007 于 2022-6-18 23:22 编辑

          左移一位就是乘以 2,左移两位就是再乘以 2,右移一位就是除以 2,右移两位就是再除以 2,如果不能整除,得到的结果只是商的整数部分。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-18 23:28:20 | 显示全部楼层
jackz007 发表于 2022-6-18 23:21
左移一位就是乘以 2,左移两位就是再乘以 2,右移一位就是除以 2,右移两位就是再除以 2,如果不 ...

我懂你说的意思,您等一下哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-18 23:28:56 | 显示全部楼层
#include<stdio.h>

void main()
{
        int a = 20, b;
        for (int i = 1; i <= 3; i++)
        {
                b = a >> i;
                printf("%d>>%d位后为:%d\n", a, i, b);
        }
}

20>>1位后为:10
20>>2位后为:5
20>>3位后为:2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-18 23:30:39 | 显示全部楼层
#include<stdio.h>

void main()
{
        int a = -20, b;
        for (int i = 1; i <= 3; i++)
        {
                b = a >> i;
                printf("%d>>%d位后为:%d\n", a, i, b);
        }
}

-20>>1位后为:-10
-20>>2位后为:-5
-20>>3位后为:-3

C:\Users\lenovo\Desktop\Project1\x64\Debug\Project1.exe (进程 2008)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
**这个-3怎么解释呢,正常不该-2吗
我正在学计算机组成原理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-19 00:40:43 | 显示全部楼层

提问,-20用二进制表示是多少?
回答,-20用二进制表示是1111111111101100

再次提问,-3用二进制表示是多少?
再次回答,-3用二进制表示是1111111111111101
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-19 00:42:54 | 显示全部楼层    本楼为最佳答案   
  1. (gdb) l
  2. 1        #include <stdio.h>
  3. 2       
  4. 3        int main(void) {
  5. 4            short a = -20;
  6. 5            short b = a >> 3;
  7. 6            return 0;
  8. 7        }
  9. (gdb) print a
  10. $12 = -20
  11. (gdb) print /x a
  12. $13 = 0xffec
  13. (gdb) print /t a
  14. $14 = 1111111111101100
  15. (gdb) print b
  16. $15 = -3
  17. (gdb) print /x b
  18. $16 = 0xfffd
  19. (gdb) print /t b
  20. $17 = 1111111111111101
  21. (gdb)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 15:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表