计算机中的数据类型

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

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

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

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

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

高级语言具有数据类型,下面以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. WPF实现TextBlock呼吸灯效果

    实现代码 <TextBlock Text="录像中" FontSize="48" Foreground="#ED4646" Horiz ...

  2. Oracle 字符串分割,并将内码转中文(简单实现),项目实战

    导读 实际项目开发过程中,可能会遇到这种情况,A表中A1字段存储B表中的内码如(1,2,3),此时需要将A表中的A1字段转中文,为了方便理解,我们这里创建学生表和老师表,一个学生对应N个老师. 创建表 ...

  3. react懒加载,减少首屏加载时间

    最近在写一个react-ant-admin的集成框架用于快速搭载中后台项目.其中遇到很多问题,最重要的应该是访问速度了.我就想 react 可不可以和 vue 一样用路由懒加载来减少首页渲染所花费的时 ...

  4. javaweb上传图片存到本地,并存储地址到数据库

    前端使用layui的图片上传,将文件base64编码,然后在后端使用转码类来操作base64编码,并保存图片到本地,继而获取文件地址,将文件地址保存到数据库中 1.使用layui的图片上传 infos ...

  5. 最简GIF解析代码gif_jumper,用于stb_image的小改进

    gif jumper gif支持多帧动画,但是没有存储总帧数,解析gif直到结束才能知道总帧数. 所以gif解析代码,要么采用链表,要么不停realloc()分配内存,stb_image的代码就是如此 ...

  6. 如何去除字符串中的 "\n" ?80% 的同学错了!

    大家好,我是鱼皮,今天分享一个小知识. 我最近负责的工作是设计一个 SQL 解析引擎.简单来说,就是将一个 SQL 表达式字符串,解析为一颗对象树,从而执行查询等一系列操作. 在最开始,我就遇到了一个 ...

  7. [oeasy]python0043_八进制_oct_octal_october_octave

    八进制(oct) 回忆上次内容 什么是 转义? 转义转义 转化含义 \ 是 转义字符 \n.\r是 转义序列 还有什么 转义序列 吗? \a是 响铃 \b 退格键 \t 水平制表符 tab键 \v.\ ...

  8. Golang 高性能 Websocket 库 gws 使用与设计(一)

    前言 大家好这里是,白泽,这期分析一下 golang 开源高性能 websocket 库 gws. 视频讲解请关注B站:白泽talk 介绍 gws:https://github.com/lxzan/g ...

  9. 小技巧:初始化后查看容器内某一bean的信息

    1.debug 2. 3.与容器名对应,可以看到容器的对应信息 4.输入表达式可以直接获取对应结果信息,这里查看的是默认SpringSecurity过滤链的bean

  10. 解决Sqoop导入导出MySQL数据错位问题

    添加--columns "columns,columns,columns" \可以在hive导入mysql时防止数据错位: