计算机中的数据类型

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

机器怎么知道这些数据是定点数还是浮点数?

如果是定点数,是有符号数还是无符号数?

事实上,汇编语言中的数据类型取决于指令操作码。

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

高级语言具有数据类型,下面以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

两种类型都是32位,各自的数据组合(状态)数量相同,但二者在数轴上表示的数据并不完全重叠

由于float型浮点数的尾数包括隐藏位在内共24位,当int型数据的高8位(24~31位)数据为非0时,无法精确转换成24位浮点数的尾数,此时发生精度溢出

int->double

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

总结:

推荐阅读:

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

C语言中的数据类型及其转换的更多相关文章

  1. Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器

    Android For JNI(二)--C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型 ...

  2. JS中的数据类型和转换

    一.JS中的数据类型 js中的数据类型可以分为五种:number .string .boolean. underfine .null. number:数字类型 ,整型浮点型都包括. string:字符 ...

  3. js中的数据类型及其转换

    Js中的数据类型 Js中的数据类型一共有六种,即number,string,boolean,underfine,null,object. 一,number Number数据类型指的是数字,可以为整型, ...

  4. js中的数据类型以及转换

    Js中的数据类型 Js中的数据类型一共有六种,即number,string,boolean,underfine,null,object. 一,number Number数据类型指的是数字,可以为整型, ...

  5. C语言中各个数据类型的取值范围

    因为CPU的差异,各系统中的数据类型所占的字节数(bytes)不同,二进制位数(bit)也不同.那么怎样才能知道自己系统的数据类型的字节数,位数呢? 授之以鱼不如授之以渔,大家可以自己从电脑里获取这些 ...

  6. C语言中格式化输出的转换说明的fldwidth和precision解析

    首先说什么是C语言的格式化输出,就是printf和它的几个变种(grep -E "v?(sn|s|f)printf").像这些函数都有一个参数format,format中可以加点转 ...

  7. 在C语言中基本数据类型所占的字节数

    基本数据类型所占的字节数其实跟C语言本身没有太大的关系,它取决于编译器的位数,下面这张表说明了不同编译器下基本数据类型的长度: 32位编译器中各基本类型所占字节数: 注:对于32位的编译器,指针变量的 ...

  8. python语言中的数据类型之字典

    数据类型 字典类型dict 用途:记录多个值,列表是索引对应值,而字典是key对应值,其中key对value有描述性 定义方式:在{ }用逗号分隔开多个元素,每个元素都是key:value形式,其中k ...

  9. 2_C语言中的数据类型 (七)printf与scanf

    1          字符串格式化输出和输入 1.1       字符串在计算机内部的存储方式 字符串是内存中一段连续的char空间,以’\0’结尾 “”是C语言表达字符串的方式 1.2       ...

  10. 2_C语言中的数据类型 (四)整数与无符号数

    1.1       sizeof关键字 sizeof是c语言关键字,功能是求指定数据类型在内存中的大小,单位:字节 sizeof与size_t类型 1.1       int类型 1.1.1      ...

随机推荐

  1. 【Hive报错】java.lang.NoSuchMethodError(com.facebook.fb303.FacebookService$Client.sendBaseOneway

    Hive2.3版本 Hadoop2.7版本 执行hive命令报错: 报错内容: CONSOLE#21/03/24 17:32:54 ERROR ql.Driver: FAILED: Hive Inte ...

  2. debian11 使用podman搭建 nacos-server

    前言 基于debian11 + podman 搭建 nacos-server 用于简单测试. nacos-server基于java,如果直接运行还要准备java环境,在docker/podman 镜像 ...

  3. mysql 临时表的好处

    客户端新建了一个会话,这个会话只是服务器与客户端1对1的关系,客户端可能在服务端建立一个临时表,满足客户端处理某些事务的需求,当客户端退出会话后,这个临时表自动drop,没有任何数据信息占用数据库空间 ...

  4. Webpack3.x升级至 4.x 小记

    近期项目部署遇到点问题,需要升级webpack版本,特此整理一小记,记录升级过程中的依赖包及报错处理. 本次升级的依赖包及对应版本对照表: npm 包 当前版本 升级版本 S/D vue ^2.5.1 ...

  5. [oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位

    键盘改造 回忆上次内容 上次练习了复制粘贴 按键 作用 <kbd>y</kbd><kbd>y</kbd> 复制光标行代码 到剪贴板 <kbd> ...

  6. 18B20的CRC官方讲解

    理解和运用MAXIM IBUTTON产品中的循环冗余校验(CRC) 摘要 : 全部1-Wire器件,包括iButton器件,都具有唯一的8字节注册码,储存在只读存储器(ROM)中.该注册码在1-Wir ...

  7. 存算一体的芯片架构是不是在胡说八道 —— 大模型解决不了英伟达的难题,AI新范式必将出现:专访安克创新CEO阳萌

    地址: https://www.youtube.com/watch?v=kMBjzxKYWw4 PS. 个人估计,如果不改变现有的计算理论,那么就只是在冯诺依曼结构基础上谈存算一体结构,我看这是在搞噱 ...

  8. HPA* (Near Optimal hierarchical Path-finding) —— 外网的讲解blog

    原地址: https://alexene.dev/2019/06/02/Hierarchical-pathfinding.html 讲解视频: https://www.youtube.com/watc ...

  9. 国产AI发展是百家争鸣还是疯狂内卷(内耗)?

    本文纯属闲谈(吐槽) 国外搞深度学习弄出了TensorFlow(编译型)以后推到工业界和学术界,但是由于其不好用(太过于复杂),同一时间另一个框架pytorch(非编译型).由于pytorch是非编译 ...

  10. 【转载】 tensorflow batch_normalization的正确使用姿势

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/computerme/article/de ...