#include <stdio.h>
int main() {
// 64 位系统
unsigned short bb = 1024;
printf("%d\n", sizeof(bb));
printf("%0x\n", bb); printf("%0x\n", (bb << 16));
}
很简单的一个 c 语言的程序,运行环境为: Configured with: --prefix=/Applications/Xcodeapp/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 9.0.0 (clang-900.0.39.2) Target: x86_64-apple-darwin17.4.0
结果是: 2 400 4000000 我记得当时学组成原理的时候,左移高位是舍弃的,这面为什么结果和预想的不一样呢,是不是编译器优化呢?还是这面的 bb << 16 只是一个临时的值,这个临时值的不是 unsigned short 的,那这个临时值的类型一般是啥呢?
1 wsy2220 2018-04-12 18:30:29 +08:00 %x 会把你的参数强制转换成 unsigned int |
![]() | 3 fgodt 2018-04-12 18:35:18 +08:00 你自己都找出来问题了 bb << 16 被转换成 int 了 |
![]() | 4 XiaoxiaoPu 2018-04-12 19:20:49 +08:00 (unsigned) char/short int 在参与运算前会先转换为 (unsigned) int |
5 ucloudu OP @XiaoxiaoPu 谢谢谢谢 |