当前位置: 首页 > news >正文

.算数操作符

移位操作符

使用条件:只能对于 int类型 使用,无符号整型这里算作正数。移位操作符移动的位数不能为负数,标准未定义这种写法,所以在不同编译器中有不同结果

a.<< 左移 对整数的补码左移一位 左边丢弃,右边补零
b.>> 右移 对整数的补码右移一位 算数移位:右边丢弃,左边补原符号位
逻辑移位:右边丢弃,左边补零 //算数移位和逻辑移位取决于编译器,大部分是算数移位

整数的二进制表达有三种
(原码,反码,补码)

对于正整数来说,三种表达方式在数值上是相同的,而负整数的三种表达在数值上并不相同

//例: 7 00000000 00000000 00000000 00000111——32位原码 00000000 00000000 00000000 00000111——32位反码 00000000 00000000 00000000 00000111——32位补码 // 由于 int 类型内存大小为 4 个字节,其存储方式为32bit的二进制,第一位为字符位,为 1 表示负数,0 为正数 ; -7 10000000 00000000 00000000 00000111——32位原码 11111111 11111111 11111111 11111000——32位反码 //反码是将原码中除字符位以外的bit位由 1 变为 0 ,由 0 变为 1 ; 11111111 11111111 11111111 11111001——32位补码 //补码就是在反码的基础上 + 1 ;

那么移位操作符是如何使用的,下面我举一个例子

int main() { int a = 7; int b = 0; b = a << 1; //此时输出 b 的结果为 14 —————— 00000000 00000000 00000000 00001110

由于7的32位原码为 ——00000000 00000000 00000000 000000111
而正整数的原码补码相同,我们遵循左移规则对a的补码左移一位,左边的二进制数丢弃,最右边补零,得到补码 ——00000000 00000000 00000000 00001110
由于第一位的符号位为零,其是正整数,原码补码相同,所以转换成十进制就是14。
我们再举一个负数的例子

int main() { int c = -7; b = c << 1; //此时输出 b 的结果为 -14 ————— 11111111 11111111 11111111 11110010补码 }

-7的原码反码补码上面已经列出,这里不再写了,我们根据左移规则对c的补码左移,左边丢弃,右边补零,得到补码——11111111 11111111 11111111 11110010
这里我们看到符号位为1,得到的是一个负数,我们先求反码,对补码减去1,得到反码11111111 11111111 11111111 11110001
再求原码,对反码除符号位的每一位进行0和1的互换,得到原码10000000 00000000 00000000 00001110
转换成十进制为-14
同理
对于右移操作符也是一样的方法,算出补码,按照规则右移,在将结果的补码转换成原码,变为十进制就能得到数值,一定要记得,在原码反码的转换中,首位符号位是不变的,但在移位的过程中,符号位是可能改变的,这也是为什么使用移位操作符会改变数值的正负。

3.位操作符

使用条件:计算时两边的操作数要为 int类型

a.& 按位与 //与:对于两个二进制数,&的两边都为1,与的结果为1,两边只要有0,结果为0
b.| 按位或 //或:对于两个二进制数,|的两边都为0,或的结果为0,两边只要有1,结果为1
c.^ 按位异或 //异或:对于两个二进制数,相同结果为0,相异结果为1

按位的含义就是对于两个操作数,按补码的二进制位,每位单独进行比较
我举一个例子

//例1: int main() { int a = 8; //00000000 00000000 00000000 00001000 8的补码 int b = -4; //11111111 11111111 11111111 11111100 -4的补码 int c = 0; c = a & b //00000000 00000000 00000000 00001000 结果的补码,由于是正数,所以原码也是这个,结果为8 a | b = //11111111 11111111 11111111 11111100 结果的补码 //11111111 11111111 11111111 11111011 反码 //10000000 00000000 00000000 00000100 原码,结果为-4 a ^ b = //11111111 11111111 11111111 11110100 补码 //11111111 11111111 11111111 11110011 反码 //10000000 00000000 00000000 00001100 原码,结果为-12 }

举一个用法

//例2: int main() { int a = 10; int b = 20; a = a ^ b;//10^20 b = a ^ b;//10^20^20 //不建立新变量,交换两个数值,只适用于int类型 a = a ^ b;//10^20^10 (20^20=0) }

4.赋值操作符

a.= 赋值

赋值操作符可以连续使用

//例: int main() { int a = 10; int b = 20; int c = 30; a = b = c + 10;//输出的结果为a=40,b=40 }

b.复合赋值操作符 += -= *= /= %= ^= &= |= <<= >>=

复合赋值操作符本质上就是对被赋值的变量进行一次计算,再将计算结果赋值给被计算变量自身

//例: int main() { int a = 0; a = a + 1; a +=1; //这两种写法结果是相同的,其他的复合赋值操作符同理 }

5.单目操作符(只有一个操作数)

a.! 逻辑反操作//把真转为假,把假转为真,C语言中一般把0视为假,非零视为真 b.- 负号 c.+ 正号

e.& 取地址(获取被操作实体的内存起始地址)

当取地址数组名时,结果为指向整个数组的指针,代表整个数组的内存的起始地址,即使和数组的首元素地址相同,但在参与指针运算时的步长不同

f.sizeof(操作数) 计算操作数的字节长度(类型,变量,数组等) //sizeof后的括号在某些情况下是可以省略的

sizeof 运算符的结果是 size_t 类型,它是重命名的unsigned __int64(无符号的8byte的int)

sizeof 的操作数可以是下列项之一:

类型名称。若要将 sizeof 用于类型名称,则该名称必须用括号括起。

一个表达式。与表达式一起使用时,可以使用或不使用括号指定 sizeof。 不计算表达式。

当 sizeof 运算符应用到数组名时,它将产生该数组的字节总数,而非由数组名表示的指针的大小。 若要获取由数组名表示的指针的大小,请将它作为参数传递给使用 sizeof 的函数。 例如:

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int my_sizeof(int*arr) { return sizeof(arr); } int main() { int a = 0; int arr[10] = { 0 }; a = my_sizeof(arr); printf("%d", a); }//输出的结果在64位环境为8,32位为4
http://www.cnnetsun.cn/news/3076151.html

相关文章:

  • AI编程Token成本将与开发者薪资持平,企业如何应对?
  • 报错解决org.springframework.web.method.annotation Failed to convert value of type ‘java.lang.String‘ to
  • ESP32 + 传感器:手把手教你做土壤监测终端
  • 微信小程序:农户手机上的「农场管家」
  • 自动灌溉系统:AI 什么时候浇水,比老农还准?
  • 批量处理远程共享目录中的特定类型文件(如 .hex、.csv 等)。
  • OpenGL学习笔记-05-着色器-数据类型/输入输出/uniform
  • 基于OpenCV与YOLO的实时目标检测系统搭建指南
  • Docker部署PostgreSQL
  • Playwright混沌工程实战:构建AI增强的韧性Web自动化测试体系
  • 【LeetCode】反转字符串
  • 京东开源实时视频视觉语言交互模型:全栈方案解析与落地实践
  • 智能体颠覆安全-360图龙锋如何用蜂群路线打造中国版Mythos
  • Java 26 发布了, 我人麻了。。
  • 玩三角洲要高配?2026年这5款旗舰游戏本让你杀穿新赛季
  • AI模型门控发布机制解析:原理、实践与行业应用
  • 2026全球EMBA客观测评:科学选型与优质项目解析
  • 工程师转型AI:从跑通Demo到收藏实战秘籍,拒绝高数劝退!
  • 微信聊天记录备份终极指南:如何安全保护你的数字记忆
  • UMDF驱动开发入门:二 详解INF文件与设备类选择
  • 软件测试——黑盒测试
  • AI Agent 三种记忆的工程落地
  • 网络安全事件报告——伪CAPTCHA诱骗用户运行危险的PowerShell脚本
  • 小白可懂的保姆级 Redis 教程
  • ponytail爆火:专治AI编程过度造轮子,代码直接砍半
  • 解密 MCP:开启 AI 与数据交互的新标准
  • 新课标下,小学数学最需要的能力不是“算得快“,而是“想得通“
  • 深入认识ClassLoader - 一次投产失败的复盘
  • DeepSeek美化-为 DeepSeek 网页版引入 Obsidian Border 主题视觉风格
  • RAG基础