#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/Xcode.app/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 谢谢谢谢
|