C 语言代码判断一个数的符号位?

作者站长头像
站长
· 阅读数 4

老师们好下面的代码,我怎么想也没有想明白会返回-10|0 = 0, 0|1 =1, 1|1 =1, 1|0 = 1,

怎么会出现-1呢,

#include <stdio.h>
#include <limits.h>

int main(){
    int sign;
    int v = -10;
    sign = (v != 0) | (v >> (sizeof(int) * CHAR_BIT - 1)); // CHAR_BIT 宏定义在头文件limits.h中
    printf("%d\n", sign);
    return 0;
}

C 语言代码判断一个数的符号位?

回复
1个回答
avatar
test
2024-06-24

为了更好的理解这个问题,我们先讲讲一个基础的知识点,我在曾经的笔记里也写过:小凯15天快速讲完c语言-简单学习第二课

根据C语言的规范,在做位运算时,整型的符号位是以补码的形式存在的。对于负数,它的符号位是1。对于正数和零,符号位是0。 好了,明白了这个知识点,我们再代入到代码里一起看看,在这个代码中,首先执行了 (v != 0) 的比较,这里是判断 v 是否等于0,结果是真,即1。然后执行 (v >> (sizeof(int) * CHAR_BIT - 1)),这里进行右移操作。

这里第二个知识点来了:在C语言中,对于带符号的整数,右移运算会将最高位的符号位进行复制,填充左侧的空位。

所以对于负数 v = -10,右移后符号位的值是1。对于正数和零,符号位的值是0。接下来进行按位或运算,(v != 0) | (v >> (sizeof(int) * CHAR_BIT - 1))。对于负数,第一个表达式 (v != 0) 的结果是1,而第二个表达式 (v >> (sizeof(int) * CHAR_BIT - 1)) 的结果是1。按位或运算后,结果是1。

最后,将结果1打印出来,即 -1。因为 %d 是用来打印有符号整数的,所以将1作为有符号整数表示的话,它的补码形式是负数,因此打印出来的结果是-1。

所以,对于输入的 -10,代码将返回-1表示其符号位是负数。

希望我的回答能帮到你!

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容