`

编程范式之字符和基本类型

 
阅读更多

在C/C++中,有以下基本类型

bool  表示真假

char    表示了256个字符

 

以下三个类型,表示scalar numbers(任意标量值)

short(2 bytes),int(4 bytes),long(4 bytes)

 

以下两种类型,表示arbitrarily precise numbers(任意精度值),用它们所表示的字节数尽可能的表示任意精度值。

float      4 bytes       

double     8 bytes       

 

binary digit  --->  bit

8个比特代表一个字节,我们可以用下图来形象的表示,


每一个比特位进行0、1选择,每一位都相对独立。

 

其正好是char类型的大小,故char类型可以表示2的八次方(256)个字符,所以ASCII表非常大。

以'A' 为例,在计算机中,必须将其想象成一个特定的数字,其ASCII码值为65, 故观察内存时,其比特位表示为0100 0001 。

 

用short类型表示数字时,如下


 对应为2^9 + 2^2 + 2^1 + 2^0 = 519

 

当short类型表示如下数时,


 对应为2^15 - 1

 

最高比特位对于数字的表示的大小并无影响,它只表示数字的正负,0表示正数,1表示负数。如下图



 

我们直观意义上认为以上二者相加时,只需将比特位相加即可得到0,而事实上若如此做,我们将会得到


 

因此,在正负数相加时,如何才能够将所有位数清零呢?

以7为例


 
 

在上图的1状态下,我们通过逆推可以得到在什么情况下,7加上某个数等于11111111 11111111,结果即为状态2。

而11111111 11111111只需加1 便可将所有比特位清零。

故状态4,我们称之为-7在计算机中的表示,即-7的补码(在-7原码[10000000 00000111]基础上,符号位不变,每位取反,末位加一),故负数在计算机中的表示方式均是采用补码方式进行保存的。这就是我们进行正负数运算时得到零的过程。

 

在-7的补码状态时,若想得到-7的相反数(+7),我们需要采用连同符号位每位取反,末位加一的方法,来得到+7的原码表示。

 

 当我们遇到下面的场景时, 

char c = 'A';
short s = c;
cout << s << endl;

result is : 65

由于char类型表示的是256个ascii字符,所以对其赋值可以是'A'、或者是65(但是内存始终表示的是[0100 0001])。而输出的结果只有一个,即'A'。

而将char类型的值赋值给short类型时,会出现如下变化, 

 
计算机会做位模式的拷贝,由于short类型本身为表示数字的类型,所以输出时不会进行字符的转译操作,故输出结果为65。

 

当过程相反时, 

short s = 67;
char a = s;
cout << a << endl;

输出结果为C, 原因如下 


 

 当大字节数赋给小字节数时,会将高位丢弃,而保留低位的比特。

 

再举一个例子: 

int i = 2^23 + 2 ^ 21 + 2^14 + 7; //这样写是为了方便表达
short s = i;

过程如下:


 

如图所示,这时计算机仅会进行位模式的简单拷贝,即丢弃高位,则数值大小改变。

 

如下这个负数的例子:

short s = -1;
int i = s;

 由于是小字节数复制给大字节数,在这个过程中,会进行符号位的扩展(负数用补码表示),如下图所示。

 


其赋值结果仍旧为-1。

 

 

在4字节32位中,我们如何来表示小数呢?

我们就要想办法,利用32位来构造出小数部分,看下图便知



 

我们可以采取逐步缩小正数部分,扩大分数部分的办法,来让计算机不断地渐进我们的小数值。

 

真正的浮点类型的结构如下所示: 


 

高位的符号位我们记为s;

接下来的8比特表示无符号整型数,我们用exp表示(0~~255);

剩下的23比特表示小数,我们记为.xxxxxxxxxxx

 

浮点数的展开形式为:

移位操作的范围为2^-127  ~~~  2^128,即化成标准形式的整数范围。

 

例如:

7.0的浮点表示,

我们需要展开成上述表达式的形式,则

7.0 * 2^0

3.5 * 2^1

1.75 * 2^2

则 exp=129, s=0      32位比特表示如下:

0 1000 0001 1100 0000 0000 0000 0000 000

 

我们将整形赋给浮点型时:

int i = 5;
float f = i;
cout << f << endl;

输出为5, 但是需要将int类型的位模式,转化成浮点类型的位模式,即1.25 * 2^2 。

 

在下面的代码中,我们取得 i 变量的地址,将其转化为float指针类型,此时计算机内部并没有像上面一样进行位模式的转换,而是原封不动的保存着原本属于 i 的01序列,但此时的位模式已经属于浮点类型,故我们在输出结果时,得到的是一个奇小的数。


 

 

在4字节浮点类型的地址转化为short类型的指针时,输出结果如下:


 

0.001953125 = 2 ^ -9

原因为:在此种方式下 float类型在转换成short类型时,不会做位模式的转换,而是直接将内存中的数据进行了读取,下图分大端模式和小端模式,在大端中,输出为0;在小端中,输出为16384(如笔者)。


 

如果单纯的是float类型转short类型,则需要将float类型进行4字节的位模式转换,在根据大小端进行位数的截取。介绍大小端存储的博客http://blog.csdn.net/ce123/article/details/6971544

 

  • 大小: 7.7 KB
  • 大小: 3.9 KB
  • 大小: 3.8 KB
  • 大小: 12.2 KB
  • 大小: 7.2 KB
  • 大小: 29.1 KB
  • 大小: 35.7 KB
  • 大小: 5.9 KB
  • 大小: 5.9 KB
  • 大小: 10.8 KB
  • 大小: 11.4 KB
  • 大小: 31.8 KB
  • 大小: 11.9 KB
  • 大小: 4.2 KB
  • 大小: 12.1 KB
  • 大小: 13 KB
  • 大小: 25.8 KB
分享到:
评论

相关推荐

    python面试题目-python-python经典面试题目-Python语言的基本概念-常用的功能和特性-编程范式-面试题目

    Python中的列表(List)和元组(Tuple)有什么区别? 什么是Python中的装饰器(Decorator)?如何使用装饰器? Python中的生成器(Generator)是什么?如何创建和使用生成器? 什么是Python中的迭代器(Iterator...

    C和C++中文帮助文档

    该参考手册是专为C语言开发者设计的,涵盖了基础知识、预处理命令、算法、正则表达式、转义字符和基本数据类型等内容。它可以帮助开发者快速掌握C语言的开发技巧,从而更轻松地开发出满意的软件。 此外,C/C++还提供了...

    python入门的基本教程.doc

    Python的设计哲学强调代码的可读性,允许开发者用少量代码表达想法,支持多种编程范式,包括面向过程、面向对象和函数式编程。 二、安装Python 首先,你需要在你的计算机上安装Python。Python的安装过程因操作系统...

    Ruby实战教程从基础到项目开发.docx

    Ruby的语法简洁明了,支持多种编程范式。 # 打印Hello, World! puts "Hello, World!" 1.3 变量和数据类型 Ruby支持多种数据类型,包括字符串、整数、浮点数、数组和哈希。 # 定义变量 name = "John" age = 30 ...

    python 工程师技能图谱

    2. 编程范式: 掌握面向对象编程(OOP)的概念,能够设计和实现类、继承、多态等。 理解函数式编程(FP)的基本原则,熟悉Lambda函数、高阶函数等。 3. 标准库和第三方库: 熟悉Python标准库,包括操作文件、处理...

    2005-2009软件设计师历年真题

     • CPU和存储器的组成、性能和基本工作原理  • 常用I/O设备、通信设备的性能,以及基本工作原理  • I/O接口的功能、类型和特性  • I/O控制方式(中断系统、DMA、I/O处理机方式)  • CISC/RISC,流水线操作...

    Compilador-Infra:ESPU-UNIKIVI 在计算机工程中的 TFC 解决方案提案,02-2018

    新编程语言的功能范围包括创建和调用带有或不带参数的过程、局部和全局变量、基本数据类型,例如整数、浮点数、布尔值、字符和字符序列(字符串)、条件和字符串结构。无偏差,标准输入输出功能,程序终止。 它的...

    软件设计师重点考点

    2.4关系范式: 121 专题七:软件工程专题 122 1、软件工程知识 122 1.1概述 122 1.2软件分析 124 1.3软件设计 125 1.4软件测试 128 1.5软件开发工具与环境(CASE) 129 1.6软件维护和软件管理 130 1.7面向对象技术 ...

    最新Java面试宝典pdf版

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    Java面试笔试资料大全

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    Java语言基础下载

    面向对象的分析、设计和编程 23 面向对象语言的发展简史 26 内容总结 29 独立实践 30 第三章:面向对象的程序设计 31 学习目标 31 类和对象的描述 32 声明类 32 声明属性 33 声明成员方法 34 源文件的布局 36 包的...

    Java面试宝典2010版

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 5、说明生活中遇到的二叉树,用java实现二叉树 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复...

    java面试题

    答:String是不可变的对象,每次对String类型进行改变都相当于产生了一个新的对象,StringBuffer是可变的字符序列,所以如果要经常改变某个字符串的话建议使用StringBuffer。 list、set、map问题? 答:set 不允许...

    JAVA面试宝典2010

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    Java面试宝典-经典

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    java面试题大全(2012版)

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

    java面试宝典2012

    4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 72 5、说明生活中遇到的二叉树,用java实现二叉树 73 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和...

Global site tag (gtag.js) - Google Analytics