C语言中的数据类型及其转换

news/2024/10/5 15:27:45

目录
  • 计算机中的数据类型
  • 整型数据之间的转换
    • 相同字长之间的转换
    • 小字长转大字长
    • 大字长转小字长
  • int、float、double之间的转换
    • float->double
    • double->float
    • float/double->int
    • int->float
    • int->double

计算机中的数据类型

计算机中的数据以二进制的形式存储在寄存器或存储器中。

机器怎么知道这些数据是定点数还是浮点数?
如果是定点数,是有符号数还是无符号数?

事实上,汇编语言中的数据类型取决于指令操作码。
存储在寄存器、存储器中的操作数本身没有数据类型,对该数进行何种数据类型的操作完全取决于指令。同一个操作数,既可以当作有符号数,也可以当作无符号数;既可以是定点数,也可以是浮点数。

高级语言具有数据类型,下面以C语言为例子介绍。

C语言中整型变量的取值范围:

以char(8位)型变量为例

无论是无符号数还是有符号数,C语言程序并不检测数据在加、减、乘等运算中产生的溢出现象。程序员应尽量避免出现这种情况,所编制的应用程序应具有对溢出进行判断的功能。

C语言中不同类型的数据可以互相进行强制类型转换。基本转换原则是尽量保持数的真值不变。

C语言中数据类型转换包括:

  • 整型数据之间的转换
  • int、float、double之间的转换

整型数据之间的转换

char、short、int、long 这4种整型数据的表示范围不一样,很可能数据转换后精度缺失,此时就只能尽量保持转换前后的机器码相同或机器码部分相同。

C语言中整型数据的转换包括:

  • 相同字长之间的转换
  • 小字长转大字长
  • 大字长转小字长

相同字长之间的转换

以char类型为例:

有如下C语言程序段:

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

执行上述两条语句后,usi的值为(D)。

A. -32767
B. 32767
C. 32768
D. 32769

【2019年题13】考虑以下C语言代码:

unsigned short usi = 65535;
short si = usi;

执行上述程序段后,si的值为(A)。

A. -1
B.-32767
C.-32768
D.-65535

小字长转大字长

  • 原数据为无符号类型,进行0扩展
  • 原数据为有符号类型,进行符号扩展

【2012年题13】假定编译器规定int和short类型长度分别为32位和16位,执行下列c语言语句

unsigned short x = 65530;
unsigned int y = x;

得到y的机器数为(B)。
A. 0000 7FFAH
B. 0000 FFFAH
C.FFFF 7FFAH
D. FFFF FFFAH

大字长转小字长

一般情况下:编译器会将机器码截短处理

  • 表示范围缩小
  • 很可能出错

整型数据之间的转换对比总结:

int、float、double之间的转换

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

float->double, double->float, float/double->int, int->float,int->double

float->double

由于double型数据的阶码和尾数的位数都比float型大,因此其表示范围更大、精度更高,转换后的double型数据与原float型数据的值完全相等。

double->float

  • 大数转换:可能发生溢出。例如:double d=1234567890123456; float f =(float)d;
  • 高精度数转换:发生舍入。例如:double d=1.123456789;float f (float) d;

float/double->int

  • 小数部分:向0方向截断
  • 大数转换:可能发生溢出

int->float

7047c9e52c055f1aa16dcaa149b25587.png

两种类型都是32位,各自的数据组合(状态)数量相同,但二者在数轴上表示的数据并不完全重叠
由于float型浮点数的尾数包括隐藏位在内共24位,当int型数据的高8位(24~31位)数据为非0时,无法精确转换成24位浮点数的尾数,此时发生精度溢出

int->double

2024f88729c18a5c8ca5152f46592617.png

double型数据的尾数包含隐藏位在内有53位,可以精确表示所有32位整数。

总结:

9c08c58f415923df0e52de5cd80ce9a8.png

推荐阅读:

  • 计算机基础知识之原码、补码、反码和移码
  • 计算机基础知识之浮点数的表示
  • IEEE754浮点数表示形式

欢迎关注公众号:愚生浅末

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

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

相关文章

机器学习之支持向量机

什么是SVM SVM(全称Support Vector Machine)中文名支持向量机。SVM是一种监督机器学习算法,是一种二分类模型,它的目的是寻找一个超平面来对样本进行分割,分割的原则是间隔最大化,最终转化为一个凸二次规划问题来求解。可用于分类或回归挑战。然而,它主要用于分类问题。…

Redis之发布订阅

发布订阅Redis 发布订阅(pub/sub)是一种消息通信模式,发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。消息发送者&消息接收者&频道可以想象这么一个场景。我们抖音、微博关注了哪个博主,当他发布一条文章时,系统就会给我们推送他…

DBAPI 安装部署standalone 数据API接口发布平台

DBAPI 项目地址:https://gitee.com/freakchicken/db-api 项目简介:零代码开发api服务,只需编写sql,就可以生成http api服务。支持api动态创建,兼容多种数据库。 适用于BI报表、数据可视化大屏的后端接口快速开发。 旨在为企业数据服务的发布提供完整解决方案 一、下载安装…

wu

转载自 他是 ISIJ 第四名,也是在线知名题库的洛谷“网红”。 2024年全国青少年信息学奥林匹克竞赛冬令营(WC)上,以优秀成绩斩下第一名年仅六年级的 $liuyi0905$,成为最夺目的选手之一。 而且虽然是六年级的选手,但他取得优异成绩后,不少网友并不感到陌生,纷纷留言: 这…

如何阅读MTF图表

前言 1943年——就在二战方酣的困顿时期——蔡司(Zeiss)发展出一套称为「调制传递函数」(德:Modulationsbertragungsfunktion;英:Modulation Transfer Function, MTF;日:変调伝达关数)的科学程序,用来评量镜头的影像品质。光学仪器业者、相机镜头制造商欣然拥抱这项新…

openGauss-1主2从1级联回切

假设omm1 omm2 omm4 是idc1,omm3 是idc2 模拟IDC1 全挂:手动将级联节点提升为主:此时idc1正常了,需要加回集群: Omm1 buildOmm2 buildOmm4 build 之后启omm3 的crontab,靠cm去选主检查新主的数据:注意点: CM 起来后不能build了,所以要先build再启CM本文来自博客园,作者…

实例:vue

实例:vue.js实现模态窗口(弹窗)| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -------------| -----…

同步mysql数据到ElasticSearch的最佳实践

同步mysql数据到ElasticSearch的最佳实践| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| ------------…