首页/文章/ 详情

从编码视角看数据类型转换

1月前浏览364

假定编译器规定char和short类型长度分别为8位和16位,执行下列C语言语句


char c = -127;
unsigned short us;
us = (unsigned short) c;

之后,us的值是多少?

这里涉及不同的数据类型转换。在CSAPP这本经典教材中,不同数据类型之间的转换实质就是对编码的重新解释。书中的原话是

▲图1

本文将数据类型转换分为两大类,一类是整型变量之间的数据类型转换,因为编码都是补码。另一类是涉及浮点类型,因其编码复杂。


整型变量之间的数据类型转换

C语言中,有一些整型变量类型的字长相同,如unsigned short和short。有一些整型变量类型的字长则不同,如char和short。整型变量之间的数据类型转换要抓住字长这一主要矛盾。这样一来,又将整型变量之间的数据类型转换分为两个小类,即相同字长和不同字长的类型之间的转换。


相同字长的整型数据之间的转换

如图2所示,4位机器码,解释成有符号数和无符号数,其数值是不同的。

▲图2


如下的C语言语句


short si = -32767;
unsigned short usi = si;

si的机器码是


1000  0000  0000  0001

同样的机器码,解释成无符号整数就是32769


不同字长的整型数据之间的转换

char 、short、int、long这4种整型数据的表示范围不一样,很可能数据转换后精度缺失,此时就只能尽量保持转换前后的机器码相同或机器码部分相同。当机器字长较短的类型转为机器字长较长的类型时,若原数据为无符号类型,机器码高位进行0扩展,比如


unsigned char uc = 254;
short s = (short) uc;

uc的机器码是


1111 1110

s的机器码则需要补0


0000 0000 1111 1110

数值保持不变。

若原数据为有符号类型,机器码高位进行符号扩展,比如


char c = -127;
unsigned short us = (short) c;

c的机器码是


1000 0001

us的机器码则需要补1,因为符号位是1


1111 1111 1000 0001

数值为65409。

当机器字长较长的类型转为机器字长较短的类型时,编译器会将机器码截短处理,表示范围缩小,很可能出错。


int i = -40832;
short s = (short) i;
char c = (char)i;

i的机器码是


1111 1111 1111 1111 0110 0000 1000 0000

s的机器码则需要截断高位的16位


0110 0000 1000 0000

数值为24704。 c的机器码则需要截断高位的24位,仅保留低8位


1000 0000

数值为-128.


有浮点数参与的数据类型转换

现有一个double类型变量    ,一个float类型变量    ,则表达式    是否成立?

int、float、double之间也可以进行强制类型转换。上述3种类型数据的机器码表示并不相同(int型数据是32位有符号整数,用补码表示;float和double型数据分别是32位和64位浮点数,它们是基于IEEE754标准的编码表示)。且3种类型数据的表示范围和精度也不相同。因此在转换过程中编译器只能保证数值尽量相等,大多数情况下只是近似值。

float类型的表示范围约为    ,而double类型的表示范围约为    ,IEEE754标准下,二者的编码结构如图3所示

▲图3


  •      时,值相同;

  •      时,大数可能溢出,高精度发生舍入。

  •      时,小数部分向0截断,大数可能溢出。因为int类型的范围小于float和double

  •      时,值相同。

  •      时,比较大的数无法精确表示。

以下是GPT的回答


如下的C语言语句


int i = 123456789;
float f = (float) i;

f的精度是否发生变化?

以下是GPT的回答


推荐两本与GPT有关的书籍


定制化GPTs(Custom GPTs)是由OpenAI推出的一种创新技术,它允许用户根据自己的特定需求和应用场景来创建定制版本的GPTs。定制化GPTs结合了用户自定义的指令、额外的专业知识以及多样化的技能,旨在为用户提供日常生活、工作或特定任务中的更多帮助和支持。 本书详细介绍了GPTs的概念、功能特点、创建第一个GPTs、指令使用技巧、知识库使用技巧,以及如何根据个人需求和应用场景创建定制化GPTs,如学习辅助类GPTs、个人成长类GPTs、办公助手类GPTs、电商和社交媒体类GPTs、短视频制作类GPTs等。 本书内容充实,语言通俗易懂,案例丰富,具有很强的可读性。它既适合初次接触AI技术的普通读者阅读,也适合有一定经验的AI从业者借鉴。此外,本书也适合那些需要了解最新ChatGPT技术动态的开发人员阅读。


本书详细介绍了如何根据个人需求和应用场景创建定制化GPTs,为各个行业的创新者开辟了新的可能性,助力了各种新应用和服务的诞生。本书从理论到实战,由浅入深,对创建定制化GPTs的方法与技术进行了全方位的介绍,为希望深入了解并应用这一前沿技术的专业人士、开发者和爱好者提供了全面的学习指导。从而根据自己的需求定制和优化GPTs。   

本书分四篇,共13章,包括ChatGPT介绍、定制化GPTs基础知识、GPTs使用场景介绍、GPTs创建步骤、使用GPTs的高级定制、使用Zapier完成自动作业、搭建LOGO制作助手GPT、搭建数学学习助手GPT、搭建邮件助手GPT、搭建插图助手GPT、搭建足球比赛查询GPTGPT Store介绍、GPT Store上架实战。   

本书内容详尽,原理论述简单明了,案例丰富,内容由浅入深,具有很强的可读性。它既适合初次接触AI技术的普通读者阅读,也适合有一定经验的AI从业者借鉴。此外,本书也适合那些需要了解最新ChatGPT技术的开发人员阅读。  


来源:数值分析与有限元编程
理论
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-03-09
最近编辑:1月前
太白金星
本科 慢慢来
获赞 12粉丝 23文章 338课程 0
点赞
收藏
作者推荐

几何非线性| 应变张量

▲图1考虑二维空间中的一个连续体, 分别是其中的两个物质点,如图3.1所示。在连续体变形前( 时刻)引入物质坐标系 ,另外,在连续体变形之后( 时刻)引入空间坐标系 。两个坐标系相关的基向量分别为 和 。按照 描述,位置矢量 位移矢量 变形前后的位置矢量之间的关系为 使用坐标系 ,变形后的物体中任意点的位置矢量: 变形前的 在变形后移动到新的位置 ,记 于是 定义梯度算子 则 其中, 叫做变形梯度, 叫做位移梯度。由(3)可得 定义 应变 则 由(9)可得 则 展开,得 忽略高阶量 ,线性化的拉格朗日应变张量为 [例1] 给出如下的运动 则由 得 作求导运算 位移梯度 来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈