首页 > 其他分享 >操作符详解(day13)

操作符详解(day13)

时间:2022-11-24 22:35:50浏览次数:45  
标签:int printf 补码 ++ 详解 操作符 day13 原码

操作符是直接对内存里存储的值进行操作,而函数是更外层的操作方式。以操作整形变量举例:

在内存中,整数都是以补码形式存储的,所以操作符可以直接操纵内存中的补码的值,而printf函数打印的却是原码的值,显然经过了编译器的加工。

注:(正整数的原码,反码,补码是一致的。而负整数的原码以符号位+整数值,反码为符号位保留,其余位取反,补码为反码+1)

1.移位操作符

int a = 5;
int b = a>>1;
printf("%d\n,b");

其逻辑如下:

整型变量a向内存申请4个字节,32个bit存储该值。其存储形式如下:

补码:00000000000000000000000000000101

由移位操作符向右移一位(空位补0)

补码:00000000000000000000000000000010

原码:00000000000000000000000000000010

编译器将该值编译,结果显然为2

2

现在我们对负数进行同样的操作

int a = -5;
int b = a>>1;
printf("%d\n,b");

其逻辑如下:

整型变量a向内存申请4个字节,32个bit存储该值。其存储形式如下:

原码:10000000000000000000000000000101

反码:11111111111111111111111111111010

补码:11111111111111111111111111111011

由移位操作符向右移一位(空位补1)

补码:11111111111111111111111111111101

反码:11111111111111111111111111111100

原码:10000000000000000000000000000011

编译器将该值编译,结果显然为-3

-3

从结果上看,用位移操作符进行整型的操作,实际上左移就是原值乘以2,右移就是除以2的模。

2.位操作符

符号

名称

写法  

&

按位与

两真为真,一假为假

|

按位或

一真为真,两假为假

^

按位异或

相同为真,相异为假

~

按位取反


实例

int main()
{
int a = 5;
int b = ~a;
printf("%d\n", b);
return 0;
}

结果为  -6

int main()
{
int a = -5;
int b = ~a;
printf("%d\n", b);
return 0;
}

结果为 4

释义

a = 5时:

原码/补码:00000000000000000000000000000101

按位取反后

原码:11111111111111111111111111111010

反码:10000000000000000000000000000101

补码:10000000000000000000000000000110

内存中存储的是a = 5按位取反后的补码,显然为-6

a = -5时:

原码:10000000000000000000000000000101

反码:11111111111111111111111111111010

补码:11111111111111111111111111111011

按位取反后

原码/补码:00000000000000000000000000000100

打印该补码,结果显然为4

编写代码实现:求一个(正负)整数存储在内存中的二进制中1的个数

#include<stdio.h>
int main()
{
int a = 0;
int count = 0;
int i = 0;
scanf("%d", &a);
for (i = 0; i < 32; i++)
{
if (1 == ((a >> i) & 1))
{
count++;
}
}
printf("count = %d\n", count);
return 0;
}

通过移位操作符,通过与00000000000000000000000000000001进行比较得到计数值。

摘下循环语句

for (i = 0; i < 32; i++)
{
if (1 == ((a >> i) & 1))
{
count++;
}
}

1)从i = 0开始计数,i<32,进入循环语句

2)a右移动0个,和1按位与,如果结果为1(右移动0位后末尾是1)

执行计数count++

3)i++

3.复合赋值操作符

4.单目操作符

 

sizeof()

计算该类型在内存存储字节数

&

取地址(与指针配套)

--

前置(先赋值再操作)后置(先操作再赋值)

~

按位取反

++

前置(先赋值再操作)后置(先操作再赋值)

int/char/long

强制转换数据类型

实例

int main()
{
int a = 1;
int b = 0;
b = a++;
printf("%5d%5d\n", a, b);
return 0;
}

结果 a为2,b为1

实例

int main()
{
int a = 1;
int b = 0;
b = ++a;
printf("%5d%5d\n", a, b);
return 0;
}

结果 a为2,b为2

5.关系操作符

符号


<


>


==


!=


关系操作符返回的是0或者1,常用于条件语句。

6.逻辑操作符

&&

||

返回值是0或者1

实例

int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
//a++ 先使用a的值0,再++, 判断a=0后,后面的 ++b && d++均不执行
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}

注:a++取出一个旧值,即a = 0中a的值,0,随后执行a++,a返回值为1.

&&语句接收返回值0,&&语句终止执行

结果为1,2,3,4

实例

int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = ++a && ++b && d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}

改写以上代码,提取的是执行后的新值,a = 1.则&&后面的语句依次执行。

6.条件操作符

int main()
{
int a, b,max;
scanf("%d%d", &a,&b);
max = a > b ? a : b;
printf("%d\n", max);
return 0;
}

exp1?exp2:exp3

exp1返回值为1,执行exp2,否则执行exp3.

7.逗号表达式

exp1,exp2,exp3

最终返回exp3执行的值。

8.操作符执行顺序

操作符详解(day13)_反码

标签:int,printf,补码,++,详解,操作符,day13,原码
From: https://blog.51cto.com/u_15862591/5885120

相关文章

  • Windows server 2008 R2 多用户远程桌面配置详解(超过两个用户)
    这篇文章主要介绍了Windowsserver2008R2多用户远程桌面配置详解(超过两个用户),需要的朋友可以参考下 注意:一下是针对win2008 serverr2的操作1、创建三个本地......
  • Maven学习-Profile详解
    Profile能让你为一个特殊的环境自定义一个特殊的构建;profile使得不同环境间构建的可移植性成为可能。Maven中的profile是一组可选的配置,可以用来设置或者覆盖配置默认值。有......
  • COCO-WholeBody 注释详解
    官方数据集说明:https://github.com/jin-s13/COCO-WholeBody1.如何预览json文件?使用Vscode,右键格式化文档即可。2.字段解读2.1关键字段之"images""images":[......
  • @Aspect 注解使用详解
    AOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是​​OOP​​​的延续,是软件开发中的一个......
  • golang 反向代理 Gin框架反向代理详解
    前言想用gin框架做一个反向代理服务,搜索了一圈,全是只讲解些皮毛的帖子,今天我就总结一下gin做反向代理的详细操作和原理正文开始之前我们先了解一些前置知识gin的通配符......
  • 网络性能评估工具Iperf详解
     一、网络性能评估工具Iperf网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理、网络存在安全漏洞等原因,都会导......
  • SD NAND 的 SDIO在STM32上的应用详解(中篇)
    四.SDIO功能框图(重点)SDIO包含2个部分:●SDIO适配器模块:实现所有MMC/SD/SDI/O卡的相关功能,如时钟的产生、命令和数据的传送。●AHB总线接口:操作SDIO适配器模块中的寄存器......
  • VC++模拟键盘输入(keybd_event() 、 PostMessage() /SendMessage()、SendInput())详解
                                           VC++模拟键盘输入找了一周,终于找到模拟键......
  • pat 并查集题目代码详解
    不得不吐槽并查集的题太少了1118:1//一道并查集查询的题目2//需要注意的几个点3//输入的时候在进行合并时,是一个一个输入的,所以需要引入一个变量来存储前一个输......
  • pat 散列题目代码详解
    1002:1//思路很简单,存哈希表直接计算就可以了2//需要注意的几个点3//求最高次数的时候判断当前的系数是否为04//倒着输出的时候注意格式5#include<bits/std......