【C语言】简单介绍进制和操作符

news2024/11/24 12:30:18

Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记
🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述

请添加图片描述

本文简要介绍进制和操作符,愿能为您提供帮助!

文章目录

    • 进制和操作符
    • **二进制介绍**
    • **进制之间转换**
    • 二级制转换为十进制
    • 十进制转换二进制
    • 二进制转换为八进制和十六进制
    • **原码、反码、补码**
    • 原码、反码、补码之间的转换
    • 移位操作符(操作数只能是整数)
    • 位操作符(操作符必须是整数)
    • 下标访问[]、函数调用()(简单过一下)
    • 优先级
    • **结合性**
    • 表达式求值
    • 整型提升
    • 算术转化

进制和操作符


二进制介绍

十进制属于一种常见的进制,它满足满十进一并且数字每一位都是0~9数字组成的。 二进制也是同理满二进一并且数字每一位都是0~1数字组成的。

:二级制、八进制、十六进制,只是数值的不同表现形式

比如

数字:15
二级制表示:1111
八进制表示:17
十进制表示:15
十六进制表示:F

进制之间转换

关于这一点,首先知道每个进制的每一位有权重,N进制的数字从右到左是个位、十位、百位…,分为每一位权重是(N)0 ,(N)1 ,(N)2…。

二级制转换为十进制

请添加图片描述

说明:将2进制的每个位乘于对应的权重值,再全部相加

十进制转换二进制

请添加图片描述

二进制转换为八进制和十六进制

  • 八进制:八进制的数字每一位是0~7的数字,各自写成二进制,最大数字7的二进制是111,所以最多有3个2进制位就足够了

  • 十六进制:十六进制的数字每一位是0~9,a ~f各自写成二进制,最大数字f的二进制是1111,所以最多有4个2进制位就足够了

对于2进制转换为8进制和16进制时,是从2进制序列中右边低位开始向左每3(4)个2进制位会换算一个8(16)进制为,剩余不够3(4)个2进制的直接换算。

比如:

二进制转换八进制
    二进制:001 101 011
    八进制:1    5    3
        
二进制转换十六进制
    二进制:0110  1011
    八进制:  6     b(11)

原码、反码、补码

整型的2进制表示方法有三种:原码、反码和补码

三种表示方法均有符号位和数值位两部分组成

  • 符号位:是一个二进制数的最高位(最左边的位),如果符号位为0,则表示该数为正数;如果符号位为1,则表示该数为负数
  • 数值位:除了符号位,剩余的都是数值位

原码、反码、补码之间的转换

  1. 正整数的原码、反码、补码**都是相同**

  2. 负整数的三种表示方式各不同

  • 原码:直接将数值按照正负数的形式翻译为二进制得到的就是原码
  • 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码
  • 补码:反码+1就得到补码

请添加图片描述

对于整型来说:数据存放在内存中其实存放的是补码

  • 在计算机系统中,数值一律用补码来表示和存储。使用补码,可以将符号位和数值位统一处理
  • 加法和减法可以统一处理(CPU只有加法器) 此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路

移位操作符(操作数只能是整数)

左移操作数 <<

移位规则:左边抛弃,右边补0

请添加图片描述

右移操作数 >>

移位规则:分为逻辑右移、算术右移

  1. 逻辑右移:左边用0填充,右边丢弃

  2. 算术右移:左边用原该值的符号位填充,右边丢弃

请添加图片描述

请添加图片描述

注:对于移位运算符,不要移动负数位,这个是标准未定义的。

在位运算中,将一个数向左移动一位相当于将其乘以2;将一个数向右移动一位相当于将其除以2


位操作符(操作符必须是整数)

位操作符:``& | ^ ~`

  1. 按位与(&):有0为0,全1为1
  • 使用规则:当两个对应的二进制位,至少存在一边为0,那么结果为0,若当两边全为1,结果才是1

​ 2.按位或(|):有1为1,全0为0

  • 使用规则:当两个对应的二进制位,至少存在有一边为1,那么结果为1,若当两边全为0,结果才是0

​ 3.按位异或(^):相同为零,不同为一

  • 使用规则:当两个对应的二进制位,两边数字相同,那么结果为0,若当两边数字不相同,那么结果为1

​ 4.按位取反(~):

  • 使用规则:用于操作符的每个二进制位取反,将1转化位0,0转化位1

典型两道题:

一道变态的面试题:

题目:实现两个数的交换(不能创建临时变量)

int main()
{
	int a = 10;
	int b = 20;
	a = a ^ b;

	printf("a = %d,b = %d\n", a, b);
	//b=a^b^b=a^0=a;
	b = a ^ b;
	//a=a^a^b=b;
	a = a ^ b;
	printf("a = %d,b = %d", a, b);
	return 0;
}

小总结:

  1. ^位操作不考虑顺序问题
  2. a^a==0
  3. a^0==a

问题:求一个整数存储在内存中的二进制中1的个数

int main()
{
	int num = 15;
	//00000000 00000000 00000000 00001111

	int i = 0;
	int cout = 0;//计数
	
	for (i = 0; i < 32; i++)
	{
		if (num & (1 << i))
		//00000000 00000000 00000000 00000001 一开始
		cout++;
	}
	printf("二进制中1的个数=%d", cout);
	
	return 0;
}

说明:利用了按位与操作符的特点,有0为0,全是1才是1

缺点:需要循环32次

优化方案:

int main()
{
	int num = 15;
	int i = 0;
	int count = 0;//计数
	while (num)
	{
		count++;
		num = num & (num - 1);
	}
	printf("⼆进制中1的个数 = %d\n", count);
	return 0;
}
达到了优化的效果,但是难以想到

逗号表达式

exp1,exp2,exp3,..expN

逗号表达式:使用逗号隔开的多个表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果

使用场景:

常规写法
while (a > 0)
{
    a = get_val();
    count_val(a);
}
使用逗号表达式
 while (a = get_val(), count_val(a), a>0)
{
}   

注:

z=(2,3,4)//4 括号里面是表达式
z=2,3,4//2  3,4是逗号表达式

下标访问[]、函数调用()(简单过一下)

下标引用操作符

操作数:一个数组名+一个索引值

int nums[10];
nums[9]=10;
[]的两个操作数是nums和9

函数调用操作符

接收一个或者多个操作数:第一个操作数是函数名;剩余的操作数就是传递给函数的参数

void test()
{
	printf("hehe\n");
}

int main()
{
	test();//这里()就是函数调用操作符
}

操作符的属性

C语言的操作符有两个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序

优先级

优先级:如果一个表达式包含多个运算符,根据与运算符的优先级判断哪个运算符先执行,并且各种运算符的优先级是不同的

3+4*5;

说明:这个表达式有加法运算符和乘法运算符。由于乘法运算符的优先级高于加法。导致先计算4*5,而不是3+4;

结合性

如果两个运算符优先级相同,优先级无法判断,这个时候就要看结合性,则根据运算符是左结合,还是右结合,决定执行顺序。

大部分运算符是左结合(从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符

具体还是看

请添加图片描述

参考:https://zh.cppreference.com/w/c/language/operator_precedence

注意:即使有了操作符的优先级和结合性,写出的表达式依然有可能不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在潜在风险的,建议不要写出特别不负责的表达式

比如:

#include <stdio.h>
int main()
{
int i = 1;
int ret = (++i) + (++i) + (++i);
printf("%d\n", ret);
printf("%d\n", i);
return 0;
}
//尝试在linux 环境gcc编译器,VS2013环境下都执⾏,看结果。

gcc编译器运行结果:

请添加图片描述

vs2022运行结果

请添加图片描述


表达式求值

整型提升

C语言中整型算术运算总是以省缺(默认)整型类型的精度来进行。对于表达式中的字符和短整型操作数为了获得这个精度之前被转换为普通整型,这个转换称为整型提升

整型提升的意义:

  • 表达式的整型运算:CPU对应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int字节长度,同时也是CPU的通用寄存器的长度
  • 关于两个char类型的相加,在CPU执行时实际上也是先转换为CPU内整形操作数的标准长度
  • CPU(genenral-purpose CPU)是难以直接实现两个8比特直接相加运算(虽然机器指令中可能有这种字节相指令)。对此表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算

如何进行整形提升?

  • 有符号整型提升是按照变量的数据类型的符号位来提升的
  • 无符号整数提升,高位补0

负数的整型提升

char c1=-1;
//1111 1111(补码)
char为有符号类型
整型提升的时候,高位补充符号位(1)
提升结果1111 1111 1111 1111 1111 1111 1111 1111

正数的整型提升

char c2=1;
//0000 0001
char为有符号类型
整型提升的时候,高位补充符号位(0)
提升结果0000 0000 0000 0000 0000 0000 0000 0000    

例子:

int main()
{
	char a = 5;
	//00000000 00000000 00000000 00000101
	//00000101 - a (截断后存储到a中)

	char b = 127;
	//00000000 00000000 00000000 01111111
	//01111111 - b (截断后存储到b中)

	char c = a + b;
	//00000000 00000000 00000000 00000101
	//00000000 00000000 00000000 01111111
	//00000000000000000000000010000100 - a+b
	//10000100 - c

	printf("%d\n", c);
	//c进行了整型提升 按符号位填充
	//11111111111111111111111110000100
	//10000000000000000000000001111011
	//10000000000000000000000001111100
	//-124
	//%d 是按照10进制的形式打印有符号的整型

	return 0;
}

算术转化

当操作符的各个操作数属于不同的类型,那么除非但其中一个操作数转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换

long double
double
float
unsigned long int
long int
unsigned int
int

如果某个操作数的类型在上面这个列表中排名靠后,那么首先要转化为另外一个操作数的类型后执行运算。
***请添加图片描述

谢谢大家的观看,这里是个人笔记,希望对你学习C有帮助。

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

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

相关文章

FD-350 水分含量传感器 485输出 墒情监测

产品概述 FD-350 水分含量传感器由电源模块、变送模块、漂零及温度补偿模块、数据处理模块等组成。采用FDR频域法&#xff0c;可以实时准确测定各种土壤不同剖面的水分含量。传感器内置信号采样及放大、零点漂移及温度补偿功能&#xff0c;用户接口简洁、方便。外型小巧轻便&a…

负荷预测 | Matlab基于TCN-GRU-Attention单输入单输出时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于TCN-GRU-Attention单输入单输出时间序列多步预测&#xff1b; 2.单变量时间序列数据集&#xff0c;采用前12个时刻预测未来96个时刻的数据&#xff1b; 3.excel数据方便替换&#xff0c;运行环境matlab20…

盛最多水的容器(双指针)

11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 …

快速安装/升级/卸载Ascend配套软件包

一、参考资料 配套MindSpore 昇腾软件安装指引&#xff08;23.0.RC3&#xff09; 快速安装CANN 二、安装Ascend配套软件包 1. Ascend配套软件包简介 Ascend配套软件包&#xff0c;包括&#xff1a;固件、驱动和CANN&#xff08;Compute Architecture for Neural Networks&…

uniapp 表单使用Uview校验 包括城市选择器

<view><!-- 注意&#xff0c;如果需要兼容微信小程序&#xff0c;最好通过setRules方法设置rules规则 --><u--form labelPosition"left" :model"model1" :rules"rules" ref"uForm" labelWidth"174"><u…

【鸿蒙开发】系统组件Row

Row组件 Row沿水平方向布局容器 接口&#xff1a; Row(value?:{space?: number | string }) 参数&#xff1a; 参数名 参数类型 必填 参数描述 space string | number 否 横向布局元素间距。 从API version 9开始&#xff0c;space为负数或者justifyContent设置为…

electron打包Vue前端

Electron-Forge 打包Vue项目 效果&#xff1a;electronforge可将前端静态页面打包成.exe、.deb和.rpm等&#xff0c;能适配各种平台 示例&#xff1a;Windows环境下将前端 Vue 项目打包成exe文件 打包后的 exe 文件 运行 exe 文件 一、项目准备 开源项目 RouYi 下载 本…

百度获评CCIA数据安全和个人信息保护社会责任评价“三星”示范单位

日前&#xff0c;由中国网络安全产业联盟&#xff08;CCIA&#xff09;数据安全工作委员会主办的“促进数据安全合规流通使用”专题研讨会&#xff08;CCIA数安委年度会议&#xff09;成功举办。与会介绍了数据安全和个人信息保护社会责任试点评价工作的开展情况&#xff0c;并…

极狐GitLab 如何在 helm 中恢复数据

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何在极狐GitLab …

Ubuntu20.04安装和编译运行lidar_align来联合标定lidar与imu的外参

硬件&#xff1a;树霉派4b 1、下载并安装lidar_align mkdir -p lidar_align/src cd lidar_align/src git clone https://github.com/ethz-asl/lidar_align.git 将 lidar_align/src/lidar_align/NLOPTConfig.cmake 文件移动到 lidar_align/src/ 下(与lidar_align同级) NLOP…

关于Linux内核code段被改写的原因分析

本文基于Linux-4.19.125&#xff0c; ARM V7&#xff0c;dual core。 1 code 段 Linux的code段&#xff08;或者说text段&#xff09;自_stext开始&#xff0c;到_etext结束&#xff0c;这段内容一般情况下是只读的&#xff0c;在理论上来说&#xff0c;这段数据在设备上应该…

Java设计模式—组合模式(Composite Pattern)

组合模式&#xff08;Composite&#xff09;&#xff0c;将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 public class CompositeTest {public static void main(String[] args){// 创建主菜单MenuComponent mainMen…

访问网站时你的电脑都做了什么

电脑在访问百度时 首先在本地hosts文件里面查看本地有无域名对应的IP地址&#xff0c;若有就直接返回。若无&#xff0c;则本地DNS服务器当DNS的客户&#xff0c;向其它根域服务器发送报文查询IP地址&#xff0c;简单来说就是帮助主机查找IP&#xff0c;所以递归查询就在客户端…

纯C语言手搓GPT-2,前OpenAI、特斯拉高管新项目火了

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 「Real men program in C.」 众所周知&#xff0c;大语言模型还在快速发展&#xff0c;应该有…

云岚到家项目

一.项目介绍 云岚到家项目是一个家政服务o2o平台&#xff0c;互联网家政是继打车、外卖后的又一个风口&#xff0c;创业者众多&#xff0c;比如&#xff1a;58到家&#xff0c;天鹅到家等&#xff0c;o2o&#xff08;Online To Offline&#xff09;是将线下商务的机会与互联网…

el-table实现表格内部横向拖拽效果

2024.4.2今天我学习了如何对el-table表格组件实现内部横向拖拽的效果&#xff0c;效果&#xff1a; 代码如下&#xff1a; 一、创建utils/底下文件 const crosswise_drag_table function (Vue){// 全局添加table左右拖动效果的指令Vue.directive(tableMove, {bind: function…

C/C++如何快速学习?少走3年弯路

于我而言&#xff0c;最开始学习就是 C&#xff0c;除了计算机专业&#xff0c;其他专业可能学习的第一门编程语言为 C 语言&#xff0c;还是谭浩强爷爷那本&#xff0c;当时想着有点 C 基础&#xff0c;无外乎就是 C 语言的升级版&#xff0c;于是开启了 C 的路程。 语言这个…

归档模式下,物理删除数据文件的完全的恢复

归档模式下&#xff0c;物理删除数据文件的完全的恢复 1、实验环境 环境归档模式 SQL> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination /arch/archivelog Oldest online log seq…

【STL】stack与queue的底层原理及其实现

文章目录 stack的介绍库中stack的使用栈的模拟实现queue的介绍库中queue的使用queue的模拟实现 stack的介绍 &#xff08;图片来自知乎&#xff09; 1.stack是一种容器适配器&#xff0c;模拟了栈的数据结构。数据只能从一端进去&#xff0c;另一端出来&#xff08;先进后出&am…

需求分析及设计定义

背景 经过不断的折腾&#xff0c;一切过程都是为了呈现输出&#xff0c;这个阶段就是要交付需求和方案的环节了&#xff0c;很多失败的项目就是上来就到这个环节&#xff0c;倒着捣鼓&#xff0c;先写个文档&#xff0c;做个原型&#xff0c;甚至提出方案&#xff0c;然后再和…