【发布时间】:2018-06-28 06:17:27
【问题描述】:
我试图在不使用头文件<limit.h> 的情况下打印int, char, short, long 的最小值。所以按位运算将是一个不错的选择。但奇怪的事情发生了。
声明
printf("The minimum of short: %d\n", ~(((unsigned short)~0) >> 1));
给我
The minimum of short: -32768
但是声明
printf("The minimum of short: %d\n", ~((~(unsigned short)0) >> 1));
给我
The minimum of short: 0
这种现象也出现在char。但它不会出现在long, int 中。为什么会这样?
值得一提的是,我使用 VS Code 作为我的编辑器。当我在语句中将光标移到unsigned char 时
printf("The minimum of char: %d\n", (short)~((~(unsigned char)0) >> 1));
它给了我一个提示(int) 0,而不是我预期的(unsigned char)0。为什么会这样?
【问题讨论】:
-
@Lundin 误解了这个问题。
-
你为什么要避免
limit.h- 这正是标准库中存在头文件的原因?! -
@Andrew 我正在阅读 K&R2(C 编程语言)一书。打印
int, long, short, char的最大值和最小值是一个练习。但是,解决方案手册(The C Answer book)提供了两种解决方案,其中之一是使用limit.h。但另一个是关于按位运算。所以我产生了兴趣并试了一下。没想到这会是个猪圈。 -
很公平 - 但请注意,K&R2 已有 20 年历史,因此不是现代 C 语言的理想教程(非常尊重 Messrs K&R)
-
@Andrew:也许这是一个误判,我不是 C 专家,但我认为阅读 K&R 并完成所有示例练习,让你有能力回答广大该站点上弹出的大多数 C 问题。对我来说,这说明了这本书。我还没有遇到过更彻底地传达指针算术、字符串库函数和复杂声明等主题的书。
标签: c visual-studio-code bitwise-operators implicit-conversion bit-shift