c - 我不明白这个例子中的位移行为
问题描述
我知道移位意味着将每个位分别向左或向右移动,但是当我尝试将 0x30 向左移动 4 个位置时,我得到 0x300 或 00110000000 二进制。(我想要的输出是 0000 0000 )。为什么它会表现这边走?我在 C 中的代码:
int main(void){
unsigned int a;
scanf("%x",&a);
printf("%b",a<<4);
}
输入:30 输出:300 预期输出:0 编辑:如果我为分配的变量使用超过 1 个字节,我希望这个输出,但 unsigned int 正好是 1 个字节,0x300 是 12 位。
解决方案
a
是一个int
(通常)32位长的。
的值0x300
是预期的int
。
即使您使用uint8_t
fora
您也需要将结果类型转换回uint8_t
以查看预期结果。
int main(void){
uint8_t a;
scanf("%hhx",&a); // you need hhx to read unsigned char (C99 only)
printf("%hhx",(uint8_t) (a<<4));
}
供您参考,如果您不进行类型转换,则该值a<<4
将被提升int
并0x300
显示
推荐阅读
- angular - 如何在 Karma 中对 forkJoin 进行单元测试
- angular-components - AngularDart - 如何在 MaterialAutoSuggestInputComponent 中保持浮动标签与字形左侧对齐?
- karate - 我们可以使用空手道库在 Visual Studio 中编写测试吗?
- python - 根据条件分解巨大 CSV 的最佳方法是什么?
- html - CSS 悬停样式和 iOS
- android - 该软件包似乎已损坏(但通过电报安装)
- reactjs - React:访问触发合成事件的组件
- android - Android:如何使用 mockK 对 Observable concatMap 组合进行单元测试
- javascript - 为什么 powershell 不运行 Angular 命令?
- xamarin - 更新 Nuget 导致异常未处理:System.TypeLoadException