数据类型转换中存在的问题分析

隐式类型转换(implicit type conversion)

隐式类型转换(implicit type conversion)包括整型提升(integer promotion)和标准算数转换(usual arithmetic conversions)

遵循较大范围优先规则

1. 整型提升(integer promotion)

C语言规定,表达式中各种小于int长度的整型值(signed/unsigned character/short integer),都必须先转换为int或unsigned int,才能送入CPU取执行运算。因为CPU中的整型运算器(ALU)操作数长度是int字节长度,使用的通用寄存器长度也是。

验证

#include <stdio.h>int main(int argc, char const *argv[])
{char a = 0xb6;short b = 0xb600;int c = 0xb6000000;if (a == 0xb6)printf("a");if (b == 0xb600)printf("b");if (c == 0xb6000000)printf("c");/*最后输出结果为c因为整型提升:a/b整型提升为int类型*/return 0;
}
#include <stdio.h>int main(int argc, char const *argv[])
{char a = 1;printf("%u", sizeof(a));printf("\n");printf("%u", sizeof(+a));   // 单操作符+,一个主要作用就是“整型提升”/*输出:14*/return 0;
}

2. 标准算数转换(usual arithmetic conversions)

当两个不同的类型操作数进行算数运算时,它们会先转换为一种类型,然后进行计算。转换规则通常是**“较大范围”的类型优先**

#include <stdio.h>int main(int argc, char const *argv[])
{int a = -5;unsigned int b = 10;int result = a + b; // a会被转成无符号整数,最终的运算会按照无符号整数的规则进行printf("result: %d\n", result);  // 5return 0;
}

这里为什么输出结果是正确的,原因在于:printf的%d格式符,结果被解释为有符号整数,即 ( 11111111111111111111111111111011 ) 2 + ( 10 ) 10 (1111 1111 1111 1111 1111 1111 1111 1011)_{2}+(10)_{10} (11111111111111111111111111111011)2+(10)10 解释为有符号整数,这个二进制超出unsigned integer表示范围,解释为负数。

-5的原码-5的反码-5的补码
0x0000 00050xFFFF FFFA0xFFFF FFFB

在这里插入图片描述

实例: 有符号和无符号混合运算问题

当不同数据类型进行运算时,编译器会根据转换规则进行隐式类型转换(如:整数和浮点数运算),以确保所有操作数的类型一致。

问题描述:

这里涉及到的是符号扩展问题,即当进行类型转换或位操作时,编译器将原数据的符号位(最高位)扩展到更高位。

#include <stdio.h>int main()
{int a = -1;         // 有符号整数 0xFFFF FFFFunsigned int b = 1; // 无符号整数if (a > b){printf("a > b\n");}else{printf("a <= b\n");}/*输出结果:a > b分析:在a,b进行比较时,a发生了隐式类型转换,转换为unsigned integer-1的计算机表示采用补码(整数采用补码表示):0x1000 0001 // 原码0xFFFF FFFE // 反码0xFFFF FFFF // 补码因此a整型 隐式转换之后的结果为:4,294,967,295*/return 0;
}

解决方案:

#include <stdio.h>int main()
{int a = -1;         // 有符号整数 0xFFFF FFFFunsigned int b = 1; // 无符号整数if (a > (int)b)     // 解决方案{printf("a > b\n");}else{printf("a <= b\n");}/*输出结果:a > b*/return 0;
}

数据类型范围溢出(overflow)

超出了所使用的数据类型所表示的范围,则会出现溢出现象。

img

整型溢出

#include <stdio.h>
#include <limits.h>
#include <cmath>int main(int argc, char const *argv[])
{int max_int = INT_MAX;int result = max_int + 2;printf("int max value: %d\n", max_int);printf("result: %d\n", result);/*输出结果:int max value: 2147483647result: -2147483647*/return 0;
}

浮点数溢出

#include <stdio.h>
#include <float.h>
#include <math.h>int main(int argc, char const *argv[])
{float large_float = FLT_MAX;float overflow_result = large_float * 2.0;printf("large_float: %e\n", large_float);printf("overflow result: %e\n", overflow_result);if (overflow_result == INFINITY){printf("result is Infinity\n");}/*输出结果:large_float: 3.402823e+038overflow result: 1.#INF00e+000result is Infinity*/return 0;
}

实例:

#include <stdio.h>int main(int argc, char const *argv[])
{long long_value = 2147483648;int int_value = (int)long_value;printf("%d\n", int_value);return 0;/*输出:-2147483648*/
}

数据截断(data truncation)

数据截断导致精度的损失:当高精度数据类型转成低精度数据类型时,会出现精度损失。例如:小数部分会直接截断

#include <stdio.h>int main(int argc, char const *argv[])
{float hv = 123.456;int lv = (int)hv;printf("%d\n", lv);  // 123return 0;
}

reference

C++/C implicit conversion

integer promotion

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

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

相关文章

堡垒机(Bastion Host)概述

Bastion Host 堡垒机 一、什么是堡垒机&#xff1f; A bastion host is a computer specially designed to mitigate cyberattacks and manage access rights to an internal network. 堡垒机Bastion Host是一种专门设计用于缓解网络攻击并管理内部网络访问权限的计算机。 在…

肖扬新书《微权力下的项目管理》读书笔记2

一个核心思想&#xff1a;“借力” 合格的项目经理是不热衷于培养人的。项目经理的工作场景和职能经理的工作场景往往有很 大不同。职能经理的工作方式通常适用于常态化工作&#xff0c;要有足够的时间去培养人&#xff0c;先把人培 养起来&#xff0c;然后再干事&#xff0c;可…

加油卡APP定制搭建,让加油更便捷!

在汽车时代中&#xff0c;汽车的数量不断增加&#xff0c;加油已经成为了大众生活中不可缺少的一部分。同时&#xff0c;加油卡的出现也为大众的汽车加油提供了更多的优惠方式&#xff0c;为大众节省经济开支&#xff0c;为车主带来便利&#xff1b;同时加油卡的发展也提高了加…

2024年华为杯研赛(E题)数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

如何远程访问局域网内的电脑?局域网内远程桌面怎么实现?揭秘4种干货技巧

想象一下&#xff0c;你正在办公室A&#xff0c;而你想访问办公室B里的某台电脑&#xff0c;却不想起身到另一楼层甚至是另一个房间。 如何不动身就能控制局域网内的另一台电脑呢&#xff1f; 这并不是科幻&#xff0c;而是完全可以通过远程桌面技术来实现。 今天&#xff0…

学习Java(一)类和对象

package demo.ceshi;public class Puppy {private int age;private String name;//构造器public Puppy( String name){this.name name;System.out.println("公主的名字叫&#xff1a;"name);}//设置age的值public void setAge(int age){this.age age;System.out.pr…

智慧仓储-AI销量预测

1、预测系统技术选型 基础层&#xff1a; Hbase、ClickHouse、Hdfs 用来做数据存储 框架层&#xff1a; 以 Spark RDD、Spark SQL、Hive 为主&#xff0c; MapReduce 程序占一小部分&#xff0c;是原先遗留下来的&#xff0c;目前正逐步替换成 Spark RDD。 选择 Spark 除了对…

rsyslogd 内存占用很高解决方案

在Kubernetes&#xff08;K8S&#xff09;集群中&#xff0c;监控日志是非常重要的&#xff0c;而rsyslogd是Linux系统中用于处理系统和应用程序日志的守护进程。有时候rsyslogd可能会占用较高的内存&#xff0c;这时候我们就需要对其进行优化和调整。 阿里云虚拟服务器&…

创客中国AIGC专题赛冠军天鹜科技:AI蛋白质设计引领者

“落霞与孤鹜齐飞,秋水共长天一色——这句出自《滕王阁序》的诗句,是我作为江西人熟记于心的佳句。它描绘的天地壮丽景色常浮现于我的脑海,正是这种豁达与壮观,启发我们将公司命名为‘天鹜科技’,我们希望将源自自然的蛋白质与现代科技的创新精神相结合,打造蛋白质设计与应用的…

16_Python的迭代器

在Python中&#xff0c;迭代是一个非常重要的概念。迭代通常指的是按照某种顺序逐个访问容器中的元素的行为。如使用for循环遍历取值的过程。 可迭代对象&#xff08;Iterable&#xff09; 可迭代对象是任何可以返回一个迭代器的对象。简单来说&#xff0c;它是可以逐一返回其…

机器学习模型中特征贡献度分析:预测贡献与错误贡献

在机器学习领域&#xff0c;特征重要性分析是一种广泛应用的模型解释工具。但是特征重要性并不等同于特征质量。本文将探讨特征重要性与特征有效性之间的关系&#xff0c;并引入两个关键概念&#xff1a;预测贡献度和错误贡献度。 核心概念 预测贡献度&#xff1a;衡量特征在…

【C++】—— stack queue deque

【C】—— stack & queue & deque 1 stack 与 queue 的函数接口2 适配器2.1 发现问题2.2 什么是适配器 3 stack 与 queue的模拟实现3.1 栈的基础框架3.2 栈的模拟实现3.3 队列的模拟实现 4 模板的按需实例化5 deque 的简单介绍5.1 vector 与list对比5.1.1 vector5.1.2 …

C++函数重载完成日期类相关计算

本文内容如下&#xff1a; 1.创建类以及函数的声明2.日期加减天数1.月份天数2.函数实现 3.日期比较大小4.日期减日期1.日期的前置和后置加加2.日期减日期的实现 5.内置类型的cout和cin本文代码如下&#xff1a; 要完成日期类的相关计算要创建自定义的类型&#xff0c;然后用函数…

获取IPV6地址的参考网站|nginx解析IPV6|linux服务器获取IPV6的方法

获取IPV6地址的参考网站 网址1 https://v6.ident.me/ 网址2 https://ifconfig.co/ 网址3 https://ifconfig.me/ IPV6检测站点推荐 网址1 http://ipv6-test.ch/ linux服务器获取IPV6的方法 以centos7为例 curl -6 ifconfig.mecurl -6 https://v6.ident.mecurl -6 https:…

python安装-升级

这里写自定义目录标题 欢迎使用Markdown编辑器 欢迎使用Markdown编辑器 运行python 或pycharm时报错 [notice] A new release of pip is available: 23.1.2 -> 24.2 [notice] To update, run: python.exe -m pip install --upgrade pipCMD 进入 DOS C:\Users\wang>pyt…

解密MQ消息积压:让你系统瞬间卡死的幕后黑手

文章目录 什么是MQ消息积压&#xff1f;消息积压的常见原因案例分析&#xff1a;如何处理消息积压&#xff1f;场景1&#xff1a;消费者处理速度过慢场景2&#xff1a;消息生产速度过快 如何预防消息积压&#xff1f;1. **监控与告警**2. **动态扩容**3. **限流与降级**4. **合…

插入与冒泡排序(C++)

\一、插入排序 1 简介 插入排序&#xff0c;也称为直接插入排序&#xff0c;其排序思想和我们平时打扑克牌时排序类似。 2 算法步骤 将第一个元素看作已排序序列&#xff0c;第二个到最后一个看作未排序序列。 第二个元素&#xff0c;与之前已排序号的序列进行对比&#x…

面试题---链表分割(安全性问题)

题目&#xff1a; 现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头指针。 假设有一链表&#xff1a; 给定x6 MySingleList …

乐(智)尚代驾-------Day3(afternoon关于aop特殊一栏)~

谢谢你们的阅读uu们&#xff01;~~ 下午这部分内容是aop往后啦&#xff0c;大家要明确一个思路&#xff0c;用aop进行简化操作更加方便 紧接上部分~ 登录校验 如何判断是否登录状态&#xff1f; – 判断请求头里面是否包含token字符串 – 根据token查询redis 如何实现&…

多源最短路径

文章目录 1. 01 矩阵&#xff08;542&#xff09;2. 飞地的数量&#xff08;1020&#xff09;3. 地图分析&#xff08;1162&#xff09;4. 地图中的最高点&#xff08;1765&#xff09; 1. 01 矩阵&#xff08;542&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 这…