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

这篇具有很好参考价值的文章主要介绍了【C语言】简单介绍进制和操作符。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C语言】简单介绍进制和操作符,C语言,c语言,开发语言

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记
🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
【C语言】简单介绍进制和操作符,C语言,c语言,开发语言

【C语言】简单介绍进制和操作符,C语言,c语言,开发语言

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

进制和操作符


二进制介绍

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

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

比如

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

进制之间转换

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

二级制转换为十进制

【C语言】简单介绍进制和操作符,C语言,c语言,开发语言

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

十进制转换二进制

【C语言】简单介绍进制和操作符,C语言,c语言,开发语言

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

  • 八进制:八进制的数字每一位是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就得到补码

【C语言】简单介绍进制和操作符,C语言,c语言,开发语言

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

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

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

左移操作数 <<

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

【C语言】简单介绍进制和操作符,C语言,c语言,开发语言

右移操作数 >>

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

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

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

【C语言】简单介绍进制和操作符,C语言,c语言,开发语言

【C语言】简单介绍进制和操作符,C语言,c语言,开发语言

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

在位运算中,将一个数向左移动一位相当于将其乘以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;

结合性

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

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

具体还是看

【C语言】简单介绍进制和操作符,C语言,c语言,开发语言

参考: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编译器运行结果:

【C语言】简单介绍进制和操作符,C语言,c语言,开发语言

vs2022运行结果

【C语言】简单介绍进制和操作符,C语言,c语言,开发语言


表达式求值

整型提升

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语言】简单介绍进制和操作符,C语言,c语言,开发语言

谢谢大家的观看,这里是个人笔记,希望对你学习C有帮助。文章来源地址https://www.toymoban.com/news/detail-852958.html

到了这里,关于【C语言】简单介绍进制和操作符的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】操作符大全(保姆级介绍)

    🚩 纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:C语言 🔥该篇将详细介绍各种操作符的功能。  操作符是编程中表示操作的符号或符号组合。它们用于执行算术、逻辑、比较和其他操作。  操作符可以分为这几类:算术操作符;移位操作符;位操作符;

    2024年02月11日
    浏览(34)
  • C语言第十二课---------操作符的介绍与使用(下)

    🎂        ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂    🎂      作者介绍:                              🎂🎂        🎂 🎉🎉🎉🎉🎉🎉🎉              🎂           🎂 作者id : 老秦包你会 ,         🎂 简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂

    2024年02月14日
    浏览(39)
  • 学了那么长时间的编程,C语言的各种操作符都搞不懂?点开这里有详细的介绍—>

    目录 前言 一、原码、反码、补码的基础概念 1.原码 2.反码 3.补码 二、原码、反码、补码的计算方法 1.原码 2.反码 3.补码 三、算术操作符 四、移位操作符 1. 左移操作符 移位规则: 2. 右移操作符 移位规则: (1) 逻辑移位 (2) 算术移位 五、位操作符 1. 按位与运算(AND)

    2024年02月10日
    浏览(41)
  • 【C语言初阶】带你轻松玩转所有常用操作符(1) ——算数操作符,移位操作符,位操作符

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,这里是君兮_,最近要准备期末复习了,可能更新的就不会那么频繁了,下个星期恢复正常更新。 今天给大家带来的是操作符详解,由于这部分的内容比较多,可能会分成几部分讲,今天带来的是第一部分的内容,废

    2024年02月11日
    浏览(44)
  • 断言操作符介绍

    目录 1.延时操作符(##) 1.1 ##m 1.2 ##[m:n] 2.蕴含操作符(|=,|-) 2.1 |=操作符 2.2 |-操作符  3 重复操作符 ([*m][-m][=m]) 3.1 连续重复操作符([*m][*m:n]) 3.2 跟随重复操作符([-m][-m:n]) 3.3 非连续重复操作符([=m]) 3.4 小结 4 SVA 4.1 与或非 4.2 动态控制函数 4.3 SVA内嵌函数 4.4 S

    2024年02月10日
    浏览(47)
  • 初始C语言——详细讲解操作符以及操作符的易错点

     第一章 “C“浒传——初识C语言(更适合初学者体质哦!)  第二章 详细认识分支语句和循环语句以及他们的易错点   第三章 初阶C语言——特别详细地介绍函数  第四章 初始C语言——详细地讲解数组的内容以及易错点  第五章  初始C语言——详细讲解操作符以及操

    2024年02月13日
    浏览(54)
  • 【c语言操作符系列1】^(异或操作符)讲解和多种例题详解

    目录 一、^ 是什么(^称为异或) 二、^的规律(特点) 三、可利用^秒杀的常见例题(重点) 1、消失的数字  2、不一样的人生密码 3、交换两个数(不能创建中间变量) 4、找出只出现一个的两个数字 是一种操作符, 针对二进制异或而言的 ,两个数对应的二进制位相同,异或

    2024年02月16日
    浏览(67)
  • <C语言> 操作符

    加法(+):用于将两个操作数相加。 减法(-):用于将第一个操作数减去第二个操作数。 乘法(*):用于将两个操作数相乘。 除法(/):用于将第一个操作数除以第二个操作数。 取模(%):用于求两个操作数相除的余数。 乘法、除法和取模具有相同的优先级,高于加法

    2024年02月12日
    浏览(51)
  • 【C语言】操作符

    算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号操作符 下标引用、函数调用和结构成员操作符 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只

    2024年01月16日
    浏览(51)
  • C语言---操作符详解

    算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号操作符 下标引用、函数调用和结构成员。 移位操作符,移动的是二进制位。 警告:对于移位运算符,不要移动负位数,这个是标准定义的。 3.1.1、原码、反码、补码介绍 整数

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包