C语言编程疑问:无符号整数表达式求值结果困惑
帮你理清C语言表达式求值的矛盾点
嘿,这问题我太熟了!大概率是你混淆了C语言里有符号整数的补码存储规则和逻辑判断的规则,先结合常见的这类习题场景给你拆解:
关于a)的结果:为什么是-1而不是32767?
首先默认你说的a)是~0(这类题最常见的表达式)。在早期很多编译器里,int是16位的:
0的二进制是00000000 00000000,按位取反~0后得到全1的二进制:11111111 11111111。- 重点来了:C语言的有符号整数用补码存储,不是原码!补码里,全1的二进制对应的就是-1——你可以反过来推:-1的补码是“原码取反加1”,原码
10000000 00000001取反是11111111 11111110,加1就得到全1的二进制。 - 你以为的32767是16位有符号
int的最大值,它的二进制是01111111 11111111(最高位是0,代表正数),和~0的全1二进制完全不是一回事哦。
关于b)的结果:为什么是1而不是0?
假设b)是基于a)的逻辑判断(比如!!~0或者把~0作为条件判断):
- C语言里的逻辑判断很简单:只要不是0的数值,都被视为逻辑真(用1表示),只有0才是逻辑假(0)。
- 刚才a)的结果是-1,属于非0值,所以逻辑判断的结果就是1。你可能误以为只有正数才算真,但C语言不管正负,只要不是0,逻辑上就是真。
如果你的a)和b)是其他表达式(比如涉及INT_MAX + 1这类溢出),核心逻辑还是绕不开补码和逻辑判断规则的。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

