计算机中的数据类型

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

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

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

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

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

高级语言具有数据类型,下面以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. Python数据分析方法与技巧

    背景介绍 数据分析是数据科学领域的核心技能之一,它涉及到数据的收集.清洗.处理.分析和可视化. 数据分析是指通过收集.清洗.处理.分析和可视化数据来发现隐藏的模式.趋势和关系的过程. 数据分析是数据科 ...

  2. vue3 'alex' is defined but never used

    解决方法 在package.json中的rules下加入 "no-unused-vars":"off" 即可

  3. SpringBoot全局异常,返回JSON数据

    全局异常处理 为什么要配全局异常? 不配全局服务端报错场景,1/0.空指针等 配置好处 统一的错误页面或错误码 对用户更友好 配置全局异常 第一步类添加注解 @ControllerAdvicce,如果 ...

  4. 全网最适合入门的面向对象编程教程:11 类和对象的Python实现-子类调用父类方法-模拟串口传感器和主机

    全网最适合入门的面向对象编程教程:11 类和对象的 Python 实现-子类调用父类方法-模拟串口传感器和主机 摘要: 本节课,我们主要讲解了在 Python 类的继承中子类如何进行初始化.调用父类的 ...

  5. PixiJS源码分析系列:第二章 渲染在哪里开始?

    第二章 渲染在哪里开始? 牢记,按第一章介绍的 npm start 启动本地调式环境才可进行调式 如果是 example 文件夹内的例子还需要 serve . 开启本地静态服务器 上一章介绍了 Pix ...

  6. 题解:AT_abc359_e [ABC359E] Water Tank

    背景 中考结束了,但是暑假只有一天,这就是我现在能在机房里面写题解的原因-- 分析 这道题就是个单调栈. 题目上问你第一滴水流到每个位置的时间.我们考虑,答案其实就是比当前木板高且距离当前木板最近的那 ...

  7. AT_arc154_b 题解

    洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定两个长度为 \(n\) 的字符串 \(S,T\),定义一次操作可取出 \(S\) ...

  8. 巧用 QLineF 从 QTransform 提取角度

    我们在对 QGraphicsItem 进行变换时,QT 提供了很多便捷的方法.但当我们想获取当前变换的角度时却有些困难,因为 QTransform 没有提供获取角度的方法.在文章Qt 从 QTrans ...

  9. Python将信息发送到指定邮箱

    目的:将Python执行脚本结果发送到指定邮箱 使用场景:可将每天.每周定时任务python跑的结果汇总,定时发送到小组成员/领导邮箱中 1.以下163邮箱为例,设置发件人是163邮箱,接收人是qq邮 ...

  10. DASCTF2022.07赋能赛PWN部分WP

    DASCTF2022.07赋能赛PWN部分WP eyfor 程序保护情况 64位ida逆向 可以看见是一个随机数的逻辑,只要我们猜不对4次就可以进入漏洞函数,但是我感觉这原本可能是==号,让用随机数的 ...