c - 左移给了我奇怪的结果
问题描述
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
printf("left shift 1 = %d\n", 1 << 1);
printf("left shift 2 = %d\n", 1 << 2);
printf("left shift 3 = %d\n", 1 << 3);
printf("left shift 4 = %d\n", 1 << 4);
printf("left shift 5 = %d\n", 1 << 5);
printf("left shift 6 = %d\n", 1 << 6);
printf("left shift 7 = %d\n", 1 << 7);
return 0;
}
我得到这样的输出:
left shift 1 = 2
left shift 2 = 4
left shift 3 = 8
left shift 4 = 16
left shift 5 = 32
left shift 6 = 64
left shift 7 = 128
数字 1 和 2 似乎是正确的,但是从 3 到 7 的其他数字发生了什么?
解决方案
这一点也不奇怪。对于无符号整数(通常也适用于不侵犯符号位的有符号整数,但这不是标准规定的),左移基本上是值的两倍。
这正是您所看到的:
1 << 0 = 0000 0001 = 1
1 << 1 = 0000 0010 = 2
1 << 2 = 0000 0100 = 4
1 << 3 = 0000 1000 = 8
1 << 4 = 0001 0000 = 16
1 << 5 = 0010 0000 = 32
1 << 6 = 0100 0000 = 64
1 << 7 = 1000 0000 = 128
推荐阅读
- docker-compose - Docker:selenium/node-chrome-debug 和 selenium/standalone-chrome 之间的区别
- javascript - 有没有办法在 nextjs 应用程序中使用 heatmap.js 作为组件?
- node.js - 如何在节点中编写 JSX?
- python - Numpy:根据所选索引将部分数组替换为另一个完整数组
- google-cloud-build - 在 Cloud Build 中使用其他服务帐号
- java - 将大量代码放在 java 的一个 try catch 块中而不使用多个 try catch 块有什么替代方法
- android - 未指定媒体功能属性
- java - Spring @Autowired:自动装配接口如何工作
- javascript - 从外部源(mongo/csv 等)加载 JavaScript 数组中数据的最快方法
- node.js - 在 ec2 实例上运行的 mongo db,在与节点应用程序连接期间,它说您不能使用 ipv4