首页 > 系统相关 >Linux--C语言数据类型转换

Linux--C语言数据类型转换

时间:2024-07-25 22:27:24浏览次数:22  
标签:类型转换 操作数 运算 -- ++ C语言 运算符 int 表达式

目录

一、数据类型之间的转换

(一)规则:不同的数据类型参与运算,需要转换为同一类型后运算

1.数值比较由小到大简单排序:

2.隐式类型转换

3.强制类型转换

二、运算符

(一)算术运算符

1.单目运算符

(1)++i 与 i++的区别

(2)--i 和 i--区别

2.双目运算符

3.三目运算符

(二)关系运算符

(1)什么是表达式?

(三)逻辑运算符

1.&&:

2.||:

3.!:

4.惰性运算

(1)短路与:&& 两边的操作数,只要左边不成立为0,直接返回假,不再校验右边。

(2)短路或:|| 两边的操作数,只要左边成立为1,直接返回真,不再校验右边。

(四)位运算符

1.说明:按位(bit)来进行运算操作的运算符

2.语法:~ & | ^ << >>

(1)  ~:按位取反

(2)  &:按位与 

(3)  |:按位或

(4)  ^:按位异或

(5)  <<:左移,按bit位往左偏移

(6)  >>:右移,按bit位往右偏移

案例1:

案例2:6818开发板图像绘制

(五)其他运算符

1.赋值运算符

2.复合赋值运算符

3.sizeof(int)

4.逗号运算符(,)

(六)运算符的优先级顺序


一、数据类型之间的转换

(一)规则:不同的数据类型参与运算,需要转换为同一类型后运算

1.数值比较由小到大简单排序:

2.隐式类型转换

说明:编译系统自动完成,一般是低优先级类型向高优先级类型转换,这种被称为自动类型转换(由小到大)

语法:

大数据类型 变量 = 小数据类型变量

举例:

 //案例一
 char c = 'A'; //65
 int num = c;
 printf("%d",num); //65
 ​
 //案例二
 char c2 = 'A'; //65
 int num2 = c2 + 22;
 printf("%d",num2); //87

3.强制类型转换

说明:程序员自己实现,一般是高优先级类型向低优先级类型转换,这种被称作强制类型转化(由大到小)

语法:

小数据类型 变量名 = (小数据类型)大数据类型变量;

举例:

 //案例1
 int num1 = 65;
 char c1 = (char)num1;
 printf("%c",c1); //A
 ​
 案例2
 int num2 = 65;
 char c2 = (char)(num2 + 32); 
 printf("%c",c2); //a

注意:强制类型转换过程中,可能会出现精度丢失的问题。如果大类型数据范围 <= 小类型数据范围,此时数据不会丢失,正常转换;如果大类型数据范围 > 小类型数据范围,此时丢失超出部分的数据,精度会缺失!

原则: 类型转换并不会改变原变量的类型

二、运算符

(一)算术运算符

1.单目运算符

说明:++ 、-- 、 +(正) 、-(负) 、*(解引用运算符)

(1)++i 与 i++的区别

int i = 1,int x = ++i; ++在前,先自加1,后运算;

int i = 1,int x = i++; ++在后,先运算,后自加1。

案例:

总结:分析上面的案例,我们发现,不管是++在前,还是++在后,计算数自身都会加1。区别在于运算的结果不一样,++在前,先自加1,后运算;++在后,先运算,后自加1。

(2)--i 和 i--区别

int i = 1,int x = --i; --在前,先自减1,后运算;

int i = 1,int x = i--; --在后,先运算,后自减1。

2.双目运算符

说明:+ - * / %

举例:

 #include <stdio.h>
 ​
 int main()
 {
     printf(3/2); // 1,为什么不是1.5,是因为是整型的运算,会直接舍弃掉小数部分
     printf(3*1.0/2) // 1.5 为什么是1.5? 3*1.0=3.0转换为double类型
     printf(10%3); // 1 求模运算(取余)
     printf(10.0%3); // 1.0
     printf(10.05%3); // error 求模运算是针对整数进行的
     return 0;
 }

注意:

        两个整数相除的结果是整数,小数部分被舍弃。要想其结果是实数,可在分子*1.0(隐式类型转换)

        求模运算(取余运算)左右两边的操作数都必须是整型。如果是类似于3.0这样的数是错误的

3.三目运算符

语法:表达式1?表达式2:表达式3,相当于if..else..的简化版

求值顺序:

        如果表达式1的值为真(1),则整个条件运算表达式的值为表达式2的值;

        如果表达式1的值为假(0),则整个条件运算表达式的值为表达式3的值。

(二)关系运算符

说明:> < >= <= != ==

案例:

(1)什么是表达式?

表达式就是表达某种意思的式子。在C语言中,表达式指的是运算符连接操作数(变量、常量...)

注意:由关系运算符构成的表达式称为关系表达式,关系表达式的值为Boolean(布尔值)

        非0:关系成立,为真

        0:关系不成立,为假

(三)逻辑运算

说明:&& (与) ||(或) !(非)

1.&&

逻辑与(且),符号两边的操作数都为真,结果才为真。举例:(5>4)&&(5-4)>1,结果为0,假

2.||

逻辑或(或),符号两边的操作数只要有一个为真,结果就为真。举例:(5>4)&&(5-4)>1,结果为1,真

3.!

逻辑反(取反),取反,非0为真,举例:!(!(5>4)),结果为1,真

4.惰性运算

所谓的惰性运算就是减少运输的次数。

(1)短路与:&& 两边的操作数,只要左边不成立为0,直接返回假,不再校验右边。
(2)短路或:|| 两边的操作数,只要左边成立为1,直接返回真,不再校验右边。

(四)位运算符

1.说明:按位(bit)来进行运算操作的运算符

2.语法:~ & | ^ << >>

(1)  ~:按位取反

说明:单目运算符,数据的每一个bit位取反,也就是二进制数位上的1变0,0变1

举例:

 unsigned char ret = ~0x05; // 0000 0101  --> 1111 1010
(2)  &:按位与 

语法:a & b

说明:首先将参与计算的操作数转换为二进制,然后按照每一位进行对齐,处理结果如下:

1 & 1:1

1 & 0:0

0 & 0:0

0 & 1:0

总结:如果我们前后两个操作数对齐位置上的二进制数字都是1,其结果是1,否则结果都是0

(3)  |:按位或

语法:a | b

说明:首先将参与计算的操作数转换为二进制,然后按照每一位进行对齐,处理结果如下:

1 | 1:1

1 | 0:1

0 | 0:0

0 | 1:1

总结:如果我们前后两个操作数对齐位置上的二进制数字只要有1,其结果是1,否则结果都是0

(4)  ^:按位异或

语法:a ^ b

说明:首先将参与计算的操作数转换为二进制,然后按照每一位进行对齐,处理结果如下:

总结:不同为1,相同为0

(5)  <<:左移,按bit位往左偏移

无符号左移:

语法:操作数 << 移动位数 (bit位)

 unsigned int a = 3 << 3;
 printf("%d\n",a); // 24

有符号左移:

语法:操作数 << 移动位数 (bit位)

 int a = -3 << 3;
 printf("%d/n",a); // -24
(6)  >>:右移,按bit位往右偏移

无符号右移:

语法:操作数 >> 移动位数 (bit位)

 unsigned int a = 3 >> 3;
 printf("%d\n",a); // 0

有符号右移:

语法:操作数 >> 移动位数 (bit位)

int a = -3 >> 3;
printf("%d/n",a); // -1
案例1:

注意:

        在进行移位运算的时候,凡是被移出去的位统统丢弃,凡是空出来的位统统补0,移位运算针对的是无符号整数;

        如果非要进行有符号的移位运算,那么左移的时候,空出来的补0,右移的时候,空出来的补符号位(原码阶段)。

案例2:6818开发板图像绘制

需求:将一张BMP图片显示到开发板的LCD屏幕上  

​说明: 屏幕显示:BGR 图片显示:RGB

实现:RGB --> BGR

        B:右移0个字节,也就是移动0位 B >> 0

        R:右移2个字节,也就是移动16位 R >> 16

        G:右移1个字节,也就是移动8位 G >> 8

(五)其他运算符

1.赋值运算符

包含:=,由右 -> 左,优先级排倒数第二

int a = 4;
int num = 5+6;

2.复合赋值运算符

包含:+= -= *= /= %=,由右 -> 左,优先级排倒数第二

int i = 1;
i += 1; // 等价于 i = i + 1
i *= 5; // 等价于 i = i * 5

3.sizeof(int)

说明:用来计算某种类型或者变量所占的字节数。(中文英文字符集问题,不标准)

4.逗号运算符(,)

说明:优先级最低,左 -> 右,由多个运算符将多个不同的式子连接起来的表达式称之为逗号表达式

语法:

 (表达式1,表达式2...表达式n);

求值顺序:先求表达式1,再求表达式2,以此类推,整个逗号表达式的值为表达式n的值。

注意:

(1)逗号表达式的优先级最低

(2)运算顺序从左往右

(3)整个逗号表达式的值取决于最右边的表达式的值

举例:

int a = 5 ,b = 3;
int ret = (a>b,a++,b++,a); // 这种写法是为了减少代码量 
print("%d\n",ret);

(六)运算符的优先级顺序

标签:类型转换,操作数,运算,--,++,C语言,运算符,int,表达式
From: https://blog.csdn.net/2201_75773226/article/details/140698253

相关文章

  • 面试场景题系列--(2)短 URL 生成器设计:百亿短 URL 怎样做到无冲突?--xunznux
    文章目录面试场景题:短URL生成器设计:百亿短URL怎样做到无冲突?1.需求分析2.短链接生成算法2.1自增法2.2散列函数法2.3预生成法3.部署模型3.1其他部署方案4.设计4.1重定向响应码4.2短URL预生成文件及预加载4.3用户自定义短URL4.4URLBase64编码4.5UR......
  • 面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux
    1.如果系统的QPS突然提升10倍该怎么设计?1.1硬件的扩展+微服务的拆分如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起,当流量一旦起来之后,单体架构的问题就暴露出来了,机器挂了所有的业务就全部无法使用了。于是,集群架构的架构开始出现,单机无法抗......
  • MySQL的查询优化思路
    目录前言解决方案减少查询SQL优化索引优化减少锁避免大事务扩容硬件升级前言一般的系统中,数据库往往都是性能瓶颈。在一个系统中,数据库被使用的频率很高,因为几乎所有的应用程序都需要与数据库交互来读取或写入数据。所以一旦数据库的响应慢,负载突增,则会大大影响系......
  • 11 个接口性能优化技巧(上)【送源码】
    接口性能优化对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题。该问题说简单也简单,说复杂也复杂。有时候,只需加个索引就能解决问题。有时候,需要做代码重构。有时候,需要增加缓存。有时候,需要引入一些中间件,比如mq。有时候,需要需要分库分......
  • 实现一个自己的OpenFeign 远程调用验证协议--Springboot 自定义拦截器验证请求合法性-
    Springboot如何实现一个自定义的拦截器处理系统发出的请求以及接收到的请求(实现一个用于feign远程调用验证的简单协议)文章目录Springboot如何实现一个自定义的拦截器处理系统发出的请求以及接收到的请求(实现一个用于feign远程调用验证的简单协议)**实现Feign拦截器的意......
  • 11 个接口性能优化技巧(下)【送源码】
     7.锁粒度在某些业务场景中,为了防止多个线程并发修改某个共享数据,造成数据异常。为了解决并发场景下,多个线程同时修改数据,造成数据不一致的情况。通常情况下,我们会:加锁。但如果锁加得不好,导致锁的粒度太粗,也会非常影响接口性能。7.1synchronized在java中提供了synchron......
  • Python——异常捕获,传递及其抛出操作
    01.异常的概念1.程序在运行时,如果python解释器遇到一个错误,会停止程序的执行,并且提示一些错误信息,这就是异常。2.程序停止执行并且提示错误信息这个动作,我们通常称之为:抛出(raise)异常。 程序开发时,很难将所有的特殊情况都处理的面面俱到,通过异常捕获可以针对突发事件做......
  • Springboot 的Bean生命周期五步、七步、十步详解以及框架源码解读生命周期-面试热点-x
    文章目录Springboot的Bean生命周期五步、七步、十步详解以及框架源码解读生命周期为什么要知道Bean的生命周期Bean的生命周期之五步堆栈信息:代码验证执行结果为Bean生命周期之七步执行结果Bean生命周期之十步增加的三步测试代码如下:执行结果:Bean的生命周期总结其他......
  • 手动部署?NONONO,动态上传热部署才是王道!!
    近期开发系统过程中遇到的一个需求,系统给定一个接口,用户可以自定义开发该接口的实现,并将实现打成jar包,上传到系统中。系统完成热部署,并切换该接口的实现。定义简单的接口这里以一个简单的计算器功能为例,接口定义比较简单,直接上代码。public interface Calculator {  ......
  • AI外包团队 Unity3D结合AI教育大模型 开发AI教师 AI外教 AI英语教师 AI课堂案例
    自2022年底ChatGPT引爆全球之后,大模型技术便迎来了一段崭新的快速发展期,由其在GPT4.0发布后,AI与教育领域结合产品研发、已成为教育+AI科技竞争的新高地、未来产业的新赛道、经济发展的新引擎和新产品的诞生地。据不完全统计,目前国内已有包括科大讯飞、百度、阿里、华为、网易在......