阶段性回顾(2)

news2024/11/20 7:23:28

 

1. 移位操作符的对象只能是整数,只能对整数的二进制位进行移动。
2. 二进制是数值的一种表示形式。一个整数占了四个字节,相当于一个整数可以用32位二进制位序列表示,那么这时候该如何判断正负呢?规定:这32位二进制序列的头一位如果是1,就是负数;如果是0,就为正数。(一个二进制序列的头一位就是符号位,根据0和1来判断符号)。
3. 不仅如此,就算是二进制的表示,也有原码与补码,反码之分。值得注意的是:在计算机里面存储与进行各种运算等等,都是通过补码进行计算的;而在屏幕上呈现的打印出来的你能看到的数据则是原码形式。
4. 那么二进制表示形式的原码,反码,补码之间又有哪些联系呢?对于正数而言(符号位为0),其原码反码补码是一模一样的。然而对于负数而言,它的反码与补码要通过计算得到。

5. 就负数而言,(原码可以变成反码与补码):反码是原码基础上符号位不变,其他位按位取反。而补码的话就是反码加1。(补码也可以变成原码):也是符号位不变按位取反,然后加1。
6. 顺便再提一下,在内存当中存储的都是补码形式的二进制,在计算机里面参与各种运算,都是以补码的形式参与,而我们看到的都是原码的值。

7. 左移:二进制补码左边丢弃,右边补0;(算术)右移:二进制补码右边丢弃,左边补符号位。
8.  在内存当中补码全为1的只有-1这个奇葩。

9. .位操作符有按位与,按位或与按位异或,它们的操作数也必须都是整数,同时也是针对二进制位进行计算,由于存储在计算机当中的都是补码,因此就是对补码进行位操作。按位异或的操作是对应的二进制位相同为0,不相同为1。

10.  对于异或操作符^,需要注意以下特点:
     1. 两个相同的整数异或结果为0。
     2. 0异或任何整数,结果还是那个整数。
     3.异或是支持交换律的。

11. 在c语言中,变量也可以拥有一个新的类型:布尔类型,_Bool flag = true或者_Bool flag = false.

这个布尔类型就是专门用来表示真假的,要使用布尔类型,必须得包含一个头文件: “stdbool.h”

12. 一个字符串常量,如“abcdef”,这个常量字符串本身就是地址,是其首个字符的地址,都不用用&取地址。

13. sizeof的内部表达式是不参与计算的。因此括号内部的等式是不影响外面的。但为什么是不计算的呢?当我们写一个代码的时候,比如说源文件是test.c,我们最终运行的是test.exe,原代码到可执行程序,中间需要编译+链接,然后最终会生成可执行程序,可执行程序才可以运行。如果说括号里面的表达式要运行的话,必须在生成可执行程序后才能够运行。但是很遗憾的是:sizeof这个操作符的处理在编译阶段就已经处理了。

14. 取反操作符~是对二进制补码的每一位按位取反(包括符号位)。

15. ++与--都分为前置与后置,后置++的规则是先在代码语句中使用,在自增1。前置++是先自增1,然后再在代码语句中使用(不管是在打印,赋值,还是函数啊等等,都一样)

16. 数组传参,形参可以写成数组,也可以写成指针,而实参就是数组名。

17. %s是用来打印字符数组的,如果你要打印整形数组的话,只能循环遍历一个一个的打印,然后在这个循环里面,可以用下标访问进行打印,用指针也可以进行打印。

18. 在这边还是得再尤其强调一次,当用数组传参的时候(比如说是实参就是数组名arr),不管你形参用什么去接收,在函数体里面,arr本质上就是代表一个指针,代表元素的地址。如果你要访问某一个数组的元素,用arr[ i ]与*(arr+i)都是一样的一个道理,这两种表达中,后者更为底层,因为前一种表达运行时实际上也是转化为后一种表达。

19. 对于并且(&&)操作符而言,只要一旦左边发面有假(或为0),那么在操作符右边就不会运行下去了无需计算,因为反正最后的结果肯定是假,因此操作符右边的式子的效果不会产生,因为根本就没有执行; 对于或者( | |)操作符而言,只要一旦左边发面有真(或为非0),那么在操作符右边就不会运行下去了无需计算,因为反正最后的结果肯定是真,因此操作符右边的式子的效果不会产生,因为根本就没有执行。这个叫做短路。

20. 逗号表达式其实就是用逗号隔开的多个表达式:exp1,exp2,exp3,exp4,exp5........expn。那么它的计算规则是怎么样的呢?它是从左向右依次执行,整个表达式的结果就是最后一个表达式(expn)的结果,但是别忘了之前的那些表达式都会被依次执行,会产生各种各样的效果。

21. 再次警告一下:如果函数传参的时候不是传址调用,那么形参就是实参的一个临时拷贝,你在函数体内改来改去,不会影响我的实参。结构体变量与平时我们再讲的一些变量,道理其实是一样的,地位平等。当你用传址调用时,函数体内部的造成变化是会对全局有影响。

22.  C语言的整型算术运算总是至少以缺省(默认)整型类型的精度来进行的,就是说至少也得是一个整型类型,以这样的精度来计算。那么为了获得这个精度,表达式里面的字符和短整型操作数(什么是操作数自己应该懂得噢)在使用之前会被转换为普通整型,这种转换就被称为整型提升。

23. C语言的整形运算(涉及到char,short,int)在运算的时候char与short类型都会被提升为int类型,这一切都是为了适应我们的CPU,因为CPU里的整型运算器的操作数一般就是int类型的字节长度,同时也是CPU通用寄存器的长度,因此,即使是两个char类型的相加,在CPU执行时实际上也要转化为CPU内整型运算器的操作数的标准长度。这一切都是为了适应我们的CPU。

24. 整型提升简而言之就是这样:
 1. 先看你这个数据的数据类型是有没有符号的。
 2. 如果是没有符号的类型,那么就高位补0,也就是说把它(二进制补码)补到32位这个长度。
 3. 如果是有符号的类型,注意: 此时2进制补码的最高位就是符号位,高位补充符号位。把它(二进制补码)补到32位这个长度。

25. 比如说我要printf("%d",c),%d是打印十进制的整数,而我们的c是char类型的变量,因此在打印的时候也需要整型提升,再次强调,只有负数的原码补码要进行转化,而正数的原码反码不用,一样的。

26. 如果表达式某个操作符的各个操作数属于不同类型,除非其中一个操作数转换为另一个操作数的类型,否则操作无法进行。到底什么意思呢?比如说一个int类型的与另外一个float类型的两个操作数相加,因为它们各自的类型都是大于等于整型的,并且操作数之间类型不一样,这时候就不能直接进行操作,编译器会进行类型转换,也就是算术转换,转化顺序依次为:int , unsigned int , long int , unsigned long int , float , double , long double

27. 对于优先级而言,一定是在相邻的操作符才讨论优先级。如果在表达式当中,两个操作符不相邻,无优先级之说.

28.  unsigned int 修饰的时候对数字的二进制补码形式是没有任何影响,只是对二进制补码解读的时候会有影响,于此同时,你这个负数虽然外表上人模狗样还是个“负数”,其实已经是一个很大很大的数值了.

29. 对于一个数值,如果想要得到它n进制形式的每一位数,只需要把这个数值不断%n,然后再/n去更新这个数值,如此循环往复。如果你要得到一个数值二进制形式下的每一位数,就可以把这个数值不断%2,然后再/2去更新这个数值,如此循环往复。但这样子的话是有缺陷的,比如对于负数而言。这时候对于负数而言的话,为了避免缺陷,需要把负数类型强制转化为unsigned int,这样子的话在数值上其实每个负数变成了很大很大很大的一个正数(我再次强调一下,在内存当中存的是二进制的补码,对正数而言,原码与补码都是一样的),虽然如此,但是那个二进制序列的形式仍然没有发生一丁点变化,这就没有背离我的初衷.

30. 假设我现在有一个32位的二进制序列,不管是几位,反正是个二进制序列就对了,那么我该如何得到这个二进制序列的最低位呢?事实上,我只需要对这个二进制序列&(按位与)1(补码形式:   .........0000000001)即可,这样子返回的结果就是那个二进制序列的最低位.

31. 按位与,按位或,按位取反,左移右移等位操作符都产生的只是一个效果,而对内存当中的二进制的布局与具体变量的数值等等都不会产生任何实质影响,也就是说表达式的结果比如说是左移或者右移或者按位与等等之后的结果,但是实际上对于本身没有发生改动的,没有副作用

32. 神奇表达式 n = n&(n-1)  对n 的二进制补码序列进行物理消灭1 ,这个表达是每执行一次,就会使n的二进制序列(补码)中的1减少一个(变为了0),随着1的不断减少,最终这个二进制序列会是一个全0的状态 

33. 在c语言中,sizeof的返回值是unsigned int(无符号的整数),size_t是sizeof计算的结果的类型,它其实也就是unsigned int

34. 对于某一个数值的n进制表示形式下,如果要得到最后一位,你只需要把那个数值%进制数;如果要得到除去最后一位的“那个形式”,只需要把那个数值/进制数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二十二讲:神州路由器OSPF单区域路由的配置

实验拓扑图如下所示 设备 端口 IP 子网掩码 网关 Router-A F0/0 172.16.1.1 255.255.255.0 无 F0/3 172.16.0.1 255.255.255.0 无 Router-B F0/0 172.16.1.2 255.255.255.0 无 F0/3 172.16.2.1 255.255.255.0 无 PC1 172.16.0.2 255.255.255.0 172.1…

解决docker容器因报错无法启动的问题,检查、修复容器错误并重启

问题复现 使用: sudo docker ps -a查看当前的docker容器: 我们想启动name为【docker-mongo】的这个容器,因此要执行 sudo docker start docker-mongo但是执行后仍旧没有重启,大概率是重启的时候报错了,查看日志&a…

Spring Boot骚操作-多数据源Service层封装

mysql, es, mongodb 三个数据源用配置文件方式连接,JPA只是正对dao做了封装,本文主要介绍如何对service层进行封装。 Spring Boot - 多个数据源Service层封装 类关系图 封装的一些配置 application.yml pom.xml 封装后使用 MySQL 动态数据访问 Mong…

坦克大战1.0,java时间处理机制

1.java 绘图坐标体系 1.1 坐标体系-介绍 下图说明了Java坐标系。坐标原点位于左上角,以像素为单位。在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。…

金融业务如何高性能传输数据

对系统要求高,通常按金融级标准设计。金融数据传输要求速度快,流量大,极强容灾。 案例分析 简化版券商算法交易平台对接交易所: 涉及场景多。既有事务数据,也有市场数据模型简单。只涉及到2个主体复杂度可选。连接交…

【结构型】装饰模式(Decorator)

目录装饰模式(Decorator)适用场景装饰模式实例代码(Java)装饰模式(Decorator) 动态地给一个对象添加一些额外的职责。就增加功能而言,装饰模式 (Decorator) 比生成子类更加灵活。 适用场景 在不影响其他对象的情况下,以动态、透…

2023让工作效率直线飞升

2022年马上就要过去,过去的一年,腾讯云HiFlow和众多腾讯系应用也帮助了许多企业完成数字化转型,许多没有代码基础的业务人员也能通过搭建工作流,高效的处理生活&工作的繁杂事务,时间精力节省50%。把时间花在更重要…

开源 | 携程机票跨端 Kotlin DSL 数据库框架 SQLlin

作者简介禹昂,携程机票移动端资深工程师,专注于 Kotlin 移动端跨平台领域,Kotlin 中文社区核心成员,图书《Kotlin 编程实践》译者。一、背景2022年9月 Kotlin 1.7.20 发布之后,Kotlin Multiplatform Mobile&#xff08…

【计算机图形学入门】笔记7:Shading着色1(光照与基本着色模型)

07Shading着色(光照与基本着色模型)1.深度缓冲Z-buffering1.画家算法:先把远处的东西画在屏幕上,再画近处的,从而近处物体覆盖远处物体。(油画家)2.深度缓冲2.Shading着色1.我们目前学了哪些知识…

CleanMyMacX2023系统清理优化工具使用评测

如果你的macbook有点年头空间不够开始卡顿了,或者你是windows用户刚转来的,我强烈建议你安装一个cleanmymac!Mac电脑清理是可以直接使用储存空间管理(关于本机->储存空间->管理)来清理,但是这里的其他…

Android开发笔记(一百九十)增强了日志功能的第二版Logcat

从Android Studio Dolphin开始,查看应用日志的Logcat全面升级,堪称Logcat 2.0版本。下面就让我们看看LogcatV2.0究竟带来了什么新特性吧。 对于Android Studio的老用户来说,小海豚版本新出的LogcatV2.0在用法上有不小的差异,一开始…

Fisher卡方全流程汇总

Fisher卡方 卡方检验研究数据的独立性,在分析样本量较少(比如小于40),也或者期望频数出现小于5时,此时使用fisher卡方检验较为适合。SPSSAU医学研究模块中的卡方检验时,有提供2*2即4表格时提供fisher卡方检…

魔方(14)133魔方、一阶鬼魔魔方、双心魔方

目录 133魔方 1,魔方三要素 2,复原方法 一阶鬼魔魔方 1,魔方三要素 2,复原方法 双心魔方 133魔方 1,魔方三要素 (1)组成部件 9个块,1个中心块,4个棱块&#xff…

ZYNQ - 以太网远程更新SD卡应用程序

写在前面 对于ZYNQ系列的板卡固化,可以通过JTAG接口,使用SDK固化到FLASH中,或者可将SD卡取出将SD卡中保存的固化工程进行修改,但在很多情况下,离线更新会很不方便,本文借鉴网上常见的远程更新QSPI FLASH的…

思维导图 制作

PPT e.g: WPS中ppt 新建 文本框一定要 在外框之内。 左键 全选中,就会出来如下。 可直接点居中,就不用浪费time调位置 全选中,右键,【组合】 形成整体,可复制到word中 选择性粘贴到word中 skill: 左键…

《Linux运维总结:Centos7.6源码安装单实例redis6.2.8》

一、部署redis服务 1.1、环境信息 环境信息如下: 主机IP操作系统Redis版本CPU架构192.168.1.191Centos7.66.2.8x86_641.2、二进制方式 1、安装环境依赖 [rootlocalhost ~]# yum -y install gcc2、安装包下载 [rootlocalhost ~]# wget https://download.redis.io…

Linux-线程(LWP)

文章目录线程线程概念进程今天的进程 vs之前的进程私有和共享资源实验验证线程的优点:线程的缺点:线程异常线程的用途:线程控制创建线程(1)先创建两个线程:链接时要引入第三方库。(2)创建多个线程:(3)线程的健壮性不强…

Pandas 替换 NaN 值

替换Pandas DataFram中的 NaN 值 问题 NaN 代表 Not A Number,是表示数据中缺失值的常用方法之一。它是一个特殊的浮点值,不能转换为 float 以外的任何其他类型。NaN 值是数据分析中的主要问题之一。为了得到理想的结果,对 NaN 进行处理是非…

LeetCode刷题复盘笔记—一文搞懂动态规划之53. 最大子数组和问题(动态规划系列第三十五篇)

今日主要总结一下动态规划的一道题目,53. 最大子数组和 题目:53. 最大子数组和 Leetcode题目地址 题目描述: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素)&#…

成年人的崩溃一触即发,掌握学习能力才能突破认知结界,干货满满!

成年人的崩溃一触即发,掌握学习能力才能突破认知结界! 今年2月份(2022-02),从小红书上购买了知识博主【老明读书】,针对学习能力的讲解分析,真是干货满满!非常感谢老明,…