【发布时间】:2015-07-18 17:13:43
【问题描述】:
我正在努力确定每个变量的边缘大小。看不懂下面的问题。
例如,要获取 char 的最大值,我使用:~ 0 >> 1
应该像这样工作:
- 将 0 转为二进制:0000 0000(我假设 char 存储在 8 位)
- 否定它:1111 1111(现在我的字符大小已经用完了)
- 向右移动一位:0111 1111(我得到 127,这似乎是正确的)
现在我想使用printf 函数来呈现这个结果。
为什么我必须像这样使用演员表:
printf("%d\n", (unsigned char)(~0) >> 1)?
我只是不明白。我认为当我超出 char 范围时它与第 2 点有关,但我不确定。
如果您能对这个问题提供更复杂的解释,我将不胜感激。
【问题讨论】:
-
数据类型的最小值和最大值在
<limits.h>中定义。 -
Er... 当表达式
~ 0 >> 1不包含对类型char的单个引用时,您究竟希望如何使用~ 0 >> 1来获得char的最大值? ??为什么~ 0 >> 1应该给你char的最大值,而不是short或long的最大值? -
@AnT:这没什么区别,因为表达式将始终以
int执行(除非任何操作数具有更高的等级)。 -
@Olaf:这不是我的意思。差异或没有差异,表达式不以任何方式绑定到所需的目标类型。 OP 应该很明显(不管语言的任何其他规则),表达式不能神奇地“知道”OP 所考虑的目标类型。它不能产生
char的最大值,除非它以某种方式明确或隐含地提及char。