在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
相关推荐
- **变量与数据类型**:C语言提供了各种基本数据类型,如整型、浮点型、字符型等,理解它们的内存占用和使用场景是编程的基础。 - **运算符与表达式**:包括算术、逻辑、关系和位运算符,它们在程序中实现计算和...
- **C++**:一种广泛使用的面向对象的编程语言,支持多种编程范式,包括过程化、泛型编程等。 #### 三、Win32字符编码 在C++编程中,特别是针对Windows平台开发时,了解字符编码方式至关重要。文档提到了几种常用...
Python是一种高级编程语言,以其简洁明了的语法和强大的功能深受开发者喜爱。在面试中,了解和掌握Python的基础概念和特性至关重要。以下是一些关键知识点的详细解释: 1. **列表(List)与元组(Tuple)的区别**:...
1. **编译器的基本结构**:编译器通常由五个主要部分组成——词法分析器、语法分析器、语义分析器、中间代码生成器和目标代码生成器。这些组件协同工作,将源代码转化为可执行程序。 2. **词法分析**:这是编译过程...
- **基本类型**:整型(如`i32`、`u64`)、浮点型(如`f32`、`f64`)、布尔型(`bool`)、字符型(`char`)和字符串(`String`、`&str`)。 - **复合类型**:元组(tuple)、数组(array)、切片(slice)、枚举...
面向对象程序设计是一种重要的编程范式,特别是在C#这样的现代编程语言中,它极大地提高了代码的可维护性和重用性。本课件“面向对象程序设计(使用VS2005和C#)课件-2.变量与数据类型”是针对安徽机电职业技术学院...
本报告总结了 Java 语言基础知识点,包括基本数据类型、变量、运算符、控制语句、循环语句、数组、字符串、面向对象编程、异常处理、多线程编程和图形用户界面编程等。 一、基本数据类型 Java 语言中有八种基本...
PHP中数据类型分为八种基本类型,分别是布尔型(bool)、整型(integer)、浮点型(float)、字符串型(string)、数组型(array)、对象(object)、资源(resource)以及空类型(null)。每种类型都有其特定的用途...
在变量章节中,详细介绍了变量的基本使用、Scala变量的声明语法和注意事项、程序中+号的使用、各种数据类型(整数、浮点数、字符、布尔值、Unit类型、Null类型和Nothing类型)的介绍和使用细节。 对于变量类型转换...
20. **函数式编程(Functional Programming)**:利用函数作为一等公民的编程范式,强调纯函数、高阶函数和惰性求值。 了解并熟练运用这些基本词汇,是学习Python编程的关键。通过不断的实践和深入学习,你将能够...
Swift语言具有现代的编程范式、性能高、安全性强等特点。《Swift基本语法(中文版)》是一份涵盖了Swift语言基础知识点的文档,包含了控制流、函数、闭包、枚举、类、属性、继承、构造过程、反初始化、自动引用计数、...
该参考手册是专为C语言开发者设计的,涵盖了基础知识、预处理命令、算法、正则表达式、转义字符和基本数据类型等内容。它可以帮助开发者快速掌握C语言的开发技巧,从而更轻松地开发出满意的软件。 此外,C/C++还提供了...
1. 面向对象编程:Python中的面向对象编程是一种编程范式,它将数据封装在对象中,并通过类和对象来实现代码的可重用性和灵活性。 2. 文件操作和异常处理:Python中的文件操作包括读取和写入文件,异常处理是一种...
C++提供了丰富的数据类型,包括基本类型和非基本类型: - **基本类型**:如`short int`、`int`、`long int`、`char`、`float`、`double`、`long double`、`bool`、`void`等,其中`bool`类型用于布尔逻辑运算,`void...
5. 面向过程和面向对象的结合:Swift支持多种编程范式,包括函数式、面向对象和命令式编程,这使得开发者可以根据需求灵活选择编程风格。 6. 高度可读性:Swift的语法简洁明了,例如,打印“Hello, world”只需要一...
基本类型有布尔型、字符型、整型、实型、复型和量子型,而复合类型包括类型的序列和联合。类型定义的语法规则说明了如何声明和使用这些类型。例如,用户可以定义复数类型,并且在定义之后,就可以使用与复数类型关联...