二进制移位
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-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。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
这个就精度丢失了
本帖最后由 jackz007 于 2022-6-18 23:22 编辑
左移一位就是乘以 2,左移两位就是再乘以 2,右移一位就是除以 2,右移两位就是再除以 2,如果不能整除,得到的结果只是商的整数部分。 jackz007 发表于 2022-6-18 23:21
左移一位就是乘以 2,左移两位就是再乘以 2,右移一位就是除以 2,右移两位就是再除以 2,如果不 ...
我懂你说的意思,您等一下哈
#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 #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吗
我正在学计算机组成原理
她与晚风 发表于 2022-6-18 23:30
#include
void main()
提问,-20用二进制表示是多少?
回答,-20用二进制表示是1111111111101100
再次提问,-3用二进制表示是多少?
再次回答,-3用二进制表示是1111111111111101
(gdb) l
1 #include <stdio.h>
2
3 int main(void) {
4 short a = -20;
5 short b = a >> 3;
6 return 0;
7 }
(gdb) print a
$12 = -20
(gdb) print /x a
$13 = 0xffec
(gdb) print /t a
$14 = 1111111111101100
(gdb) print b
$15 = -3
(gdb) print /x b
$16 = 0xfffd
(gdb) print /t b
$17 = 1111111111111101
(gdb)
页:
[1]