当前位置: 首页 > 知识库问答 >
问题:

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

赵浩邈
2023-09-10

老师们好
下面的代码,我怎么想也没有想明白会返回-1
0|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;}

image.png

共有2个答案

闾丘选
2023-09-10

这个要看一下深入理解操作系统, 有符号整数的实现, 补码.

这个语句是个UB, 编译器的实现不一定遵从符号位为1时右移补1

 sign = (v != 0) | (v >> (sizeof(int) * CHAR_BIT - 1));

对于遵从符号位为1时右移补1的编译器

第一个表达式返回1, 第二个表达式返回-1

1|-1 返回-1

二进制:
0b0000 0000 0000 0000 0000 0000 0000 0001
按位或
0b1111 1111 1111 1111 1111 1111 1111 1111
结果为
0b1111 1111 1111 1111 1111 1111 1111 1111

终翔
2023-09-10

为了更好的理解这个问题,我们先讲讲一个基础的知识点,我在曾经的笔记里也写过:
小凯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表示其符号位是负数。

希望我的回答能帮到你!

 类似资料:
  • 本文向大家介绍C语言统计字符个数代码分享,包括了C语言统计字符个数代码分享的使用技巧和注意事项,需要的朋友参考一下 C语言实现统计字符个数 再来一则C语言统计输入字符个数的代码 以上所述就是本文的全部内容了,希望大家能够喜欢

  • 空格、制表符、换行符等统称为 空白符(space character),它们只用来占位,并没有实际的内容,也显示不出具体的字符。 制表符分为水平制表符和垂直制表符,它们的 ASCII 编码值分别是 9 和 11。 垂直制表符在现代计算机中基本不再使用了,也没法在键盘上直接输入,它已经被换行符取代了。 水平制表符相当于四个空格,对于大部分编辑器,按下 Tab 键默认就是输入一个水平制表符;如果你进行

  • 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。 下面是大多数编程语言中典型的判断结构的一般形式: 判断语句 C++ 编程语言提供了以下类型的判断语句。点击链接查看每个语句的细节。 语句 描述 if 语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 if...else 语句 一个 if 语句 后可跟一个可选

  • 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -> 成员选择(指针) 对象指针->成员名 2 - 负号运算符 -表达式 右到左 单目运算符 (类型) 强制类型转换 (数据类型)表达式 ++ 自增运算符 ++变量名/变量名++ 单目运算符 -- 自减运算符 --变

  • 主要内容:if 语句,if else 语句,if else if 语句在 C# 编程中,if 语句主要用于条件判断,C# 中支持多种类型的 if 语句: if 语句; if else 语句; if else if 语句。 if 语句 C# 中的 if 语句用于条件判断,其中包含一个布尔表达式,后面跟随着若干要执行的代码,当布尔表达式为真时,后面跟随的代码就会执行,if 语句的语法格式如下: if(布尔表达式){     表达式为真时要执行的代码; } if 语句的执

  • 本文向大家介绍使用C语言判断英文字符大小写的方法,包括了使用C语言判断英文字符大小写的方法的使用技巧和注意事项,需要的朋友参考一下 C语言isupper()函数:判断字符是否为大写英文字母 头文件: 定义函数: 函数说明:检查参数c是否为大写英文字母。 返回值:若参数c 为大写英文字母,则返回非 0,否则返回 0。 附加说明:此为宏定义,非真正函数。 范例:找出字符串str 中为大写英文字母的字符