c 语言里面关于左移

2018-04-12 18:25:35 +08:00
 ucloudu

#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 的,那这个临时值的类型一般是啥呢?

1511 次点击
所在节点   2018
5 条回复
wsy2220
2018-04-12 18:30:29 +08:00
%x 会把你的参数强制转换成 unsigned int
ucloudu
2018-04-12 18:32:16 +08:00
@wsy2220 我直接 sizeof(bb << 16) 你猜是多少,结果是 4
fgodt
2018-04-12 18:35:18 +08:00
你自己都找出来问题了 bb << 16 被转换成 int 了
XiaoxiaoPu
2018-04-12 19:20:49 +08:00
(unsigned) char/short int 在参与运算前会先转换为 (unsigned) int
ucloudu
2018-04-12 19:43:52 +08:00
@XiaoxiaoPu 谢谢谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/446322

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX