`

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

 
阅读更多

在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
分享到:
评论

相关推荐

    CS107:斯坦福编程范式

    - **变量与数据类型**:C语言提供了各种基本数据类型,如整型、浮点型、字符型等,理解它们的内存占用和使用场景是编程的基础。 - **运算符与表达式**:包括算术、逻辑、关系和位运算符,它们在程序中实现计算和...

    MFC字符串类.txt

    - **C++**:一种广泛使用的面向对象的编程语言,支持多种编程范式,包括过程化、泛型编程等。 #### 三、Win32字符编码 在C++编程中,特别是针对Windows平台开发时,了解字符编码方式至关重要。文档提到了几种常用...

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

    Python是一种高级编程语言,以其简洁明了的语法和强大的功能深受开发者喜爱。在面试中,了解和掌握Python的基础概念和特性至关重要。以下是一些关键知识点的详细解释: 1. **列表(List)与元组(Tuple)的区别**:...

    CC++规范编程范式规范化写程序

    ### CC++规范编程范式规范化写程序 #### 1. 文件结构 - **1.1 版权和版本的声明** 在每个头文件和定义文件的开头,应该包含版权和版本声明信息。这部分内容通常包括以下几方面: 1. **版权信息**:明确指出该...

    广东工业大学编译原理试卷

    1. **编译器的基本结构**:编译器通常由五个主要部分组成——词法分析器、语法分析器、语义分析器、中间代码生成器和目标代码生成器。这些组件协同工作,将源代码转化为可执行程序。 2. **词法分析**:这是编译过程...

    多范式的编程语言详解Rust

    - **基本类型**:整型(如`i32`、`u64`)、浮点型(如`f32`、`f64`)、布尔型(`bool`)、字符型(`char`)和字符串(`String`、`&str`)。 - **复合类型**:元组(tuple)、数组(array)、切片(slice)、枚举...

    面向对象程序设计(使用VS2005和C#)课件-2.变量与数据类型

    面向对象程序设计是一种重要的编程范式,特别是在C#这样的现代编程语言中,它极大地提高了代码的可维护性和重用性。本课件“面向对象程序设计(使用VS2005和C#)课件-2.变量与数据类型”是针对安徽机电职业技术学院...

    2022年java实验报告总结.doc

    本报告总结了 Java 语言基础知识点,包括基本数据类型、变量、运算符、控制语句、循环语句、数组、字符串、面向对象编程、异常处理、多线程编程和图形用户界面编程等。 一、基本数据类型 Java 语言中有八种基本...

    PHP数据类型的总结分析

    PHP中数据类型分为八种基本类型,分别是布尔型(bool)、整型(integer)、浮点型(float)、字符串型(string)、数组型(array)、对象(object)、资源(resource)以及空类型(null)。每种类型都有其特定的用途...

    尚硅谷大数据之Scala语言核心编程.pdf

    在变量章节中,详细介绍了变量的基本使用、Scala变量的声明语法和注意事项、程序中+号的使用、各种数据类型(整数、浮点数、字符、布尔值、Unit类型、Null类型和Nothing类型)的介绍和使用细节。 对于变量类型转换...

    Python 基本编程词汇.zip

    20. **函数式编程(Functional Programming)**:利用函数作为一等公民的编程范式,强调纯函数、高阶函数和惰性求值。 了解并熟练运用这些基本词汇,是学习Python编程的关键。通过不断的实践和深入学习,你将能够...

    Swift基本语法(中文版)

    Swift语言具有现代的编程范式、性能高、安全性强等特点。《Swift基本语法(中文版)》是一份涵盖了Swift语言基础知识点的文档,包含了控制流、函数、闭包、枚举、类、属性、继承、构造过程、反初始化、自动引用计数、...

    C和C++中文帮助文档

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

    码上行动:零基础学会Python编程.pptx

    1. 面向对象编程:Python中的面向对象编程是一种编程范式,它将数据封装在对象中,并通过类和对象来实现代码的可重用性和灵活性。 2. 文件操作和异常处理:Python中的文件操作包括读取和写入文件,异常处理是一种...

    Pascal转C++学习笔记——1.基本知识

    C++提供了丰富的数据类型,包括基本类型和非基本类型: - **基本类型**:如`short int`、`int`、`long int`、`char`、`float`、`double`、`long double`、`bool`、`void`等,其中`bool`类型用于布尔逻辑运算,`void...

    Apple Swift编程语言入门教程

    5. 面向过程和面向对象的结合:Swift支持多种编程范式,包括函数式、面向对象和命令式编程,这使得开发者可以根据需求灵活选择编程风格。 6. 高度可读性:Swift的语法简洁明了,例如,打印“Hello, world”只需要一...

Global site tag (gtag.js) - Google Analytics