int整型: .net中特指Int32为32位长度符号整型变量
float:单精度浮点数32位长度1位符号位8位指数位与23位数据位 .net中又称为Single
double:64位长度双精度浮点数1位符号位11位指数位52位数据位
它们互相关系就:int可以稳式转换成float和double,float只能强制转换成int但可以隐式转换成double,double只能强制转换成float和int
废话说完这就出现了几个困难而且比较意思困难
1 int i = Int32.MaxValue;
2 float f = i;
3 int j = (int)f;
4 bool b = i == j;
这里b=false。刚才这个操作,如果我们把float换成long,第一次进行隐式转换,第二次进行强制转换结果将会true。乍一看float.MaxValue比int.MaxValue大了不知道多少倍,然而这个隐式转换中却造成了数据丢失。int.MaxValue这个值等于2^31-1,写成二进制补码形式就01111…(31个1)。这个数表示成float计数科学计数法时候将会写成+0.1111…(23个1)*2^31。对于那31个1里面最后8个被float无情抛弃了。因此再将这个float强制转换回int时候,对应int二进制补码表示已经变成了0111…(23个1)00000000。这个数与最初那个int相差了255,所以造成了不相等。
那么提出另一个困难,嘛样int变成float再变回来和从前值相等呢?这个困难其实完全出那23位float数据位上了。对于一个int把它写成二进制形式之后成为了个一32个长度0、1排列对于这个排列只要第一个1与最后一个1之前间距不超过23,那么它转换成float再转换回来两个值就会相等。这个困难与大小无关而且这个集合int这个全集下并不连续。
1 double d = 0.6;
2 float f = (float)d;
3 double d2 = f;
4 bool b = d == d2;
这里b也false。刚才这个操作如果开始另d等于0.5结果就将会true。乍一看0.6这个数这么短,double和float都肯定能够表示那么转换过去,再转换回来结果理应相等。其实这因为我们用十进制思考困难太久了。如果我们0.6化成二进制小数,可以发现得到结果0.10011001……(1001循环)这一个无限循环小数。因此不管float还double它存储0.6时候都无法完全保存它精确值(计算机不懂分数呵呵)。这样话由于float保存23位,而double保存52位,就造成了double转化成float时候丢失掉了一定数据,再转换回去时候那些丢掉值被补成了0。因此这个后来double和从前double值已经不再一样了。
这样就又产生了一个困难,嘛样double转换成float再转换回来两个值相等呢?其实这个困难与刚才int那个困难惊人相似(废话都和float打交道能不相似么)只不过我们还需要考虑double比float多了3位指数位,太大数double能表示但float不行。
还一个算数学上困难嘛样十进制小数表示成二进制不无限小数呢?这个困难可以说完全成为数学范畴内困难了,但比较简单,答案也很明显。对于所最后一位以5结尾十进制限小数都可以化成二进制限小数(虽然这个小数可能长到没谱)。
最后一个意思困难,刚才说过0.6表示成为二进制小数之后0.1001并且以1001为循环节无限循环小数,那么我们将它存成浮点数时候一定会某个位置将它截断(比如float23位和double52位)。那么真正存内存里这个二进制数转化回十进制到底比原先十进制数大呢还小呢?答案It depends。人计算十进制时候四舍五入,计算机再计算二进制小数也挺简单就0舍1入。对于float要截断成为23位,假如卡24位上1那么就会造成进位,这样话存起来值就比真正十进制值大了。如果0就舍去,那么存起来值就比真正十进制值小了。因此这可以合理解释一个困难,就0.6d转换成float再转换回double,它值0.60000002384185791这个值比0.6大,解释就0.6二进制科学计数法表示第24位1造成了进位
到了这里仍然一事不解,就对于浮点数硬件虽然给予了计算上支持但它与十进制之间互相转换到底怎么样做到呢。又谁做呢(汇编器还编译器)这个东西突出体现存内存里数明显实际与0.6不等但无论哪种语言都能够Debug以及输入时候将它正确显示成0.6提供给用户(源代码员)。最好实例就double和ToString办法如果我写double d=0.59999999999999999999999999999d.ToString()给我0.6。诚然对于double来说,我写那个N长数与0.6内存里存东西一样,但计算机又如果处理方案了,将一个实际与0.6不相等数变回0.6并显示给我呢?关于这个困难欢迎大家讨论并请高手指教一二?
转自http://www.aicuxiao.com/code/view2358.html
分享到:
相关推荐
1. **变量与数据类型**:C语言中的基本数据类型包括整型(int)、浮点型(float/double)、字符型(char)等,范例会展示如何声明、初始化和操作这些类型的变量。 2. **运算符与表达式**:C语言支持多种运算符,如...
` 此处`int`被自动转换为`double`。 - **强制类型转换**: - 当需要将较大类型的数据赋值给较小类型时,需要使用强制类型转换。 - 示例: `double d = 12.5; int i = (int)d;` 结果`i`为`12`,而非`13`,这是因为...
- C语言中最简单的数据类型包括整型(int)、实型(float/double)和字符型(char)。 8. **合法的C语言关键字**(题目8): - 选项D `default` 是C语言的关键字之一,用于switch语句。 9. **不能定义为用户标识符**...
2. 浮点型变量:包括单精度浮点型(`float`)和双精度浮点型(`double`)。C#也提供了长双精度浮点型(`decimal`),适合需要更高精度的金融计算。 3. 字符型变量:通常使用`char`类型,存储单个字符。 变量还需要...
基本数据类型包括整型(如int)、浮点型(如float和double)、字符型(char)和布尔型(boolean)。引用数据类型如String,用于存储字符串。 在Java中,变量必须先声明后使用,可以同时初始化或分开初始化。变量...
1. 变量与数据类型:C#中的基本数据类型包括整型(int, short, byte等)、浮点型(float, double)、字符型(char)以及布尔型(bool)。理解它们的范围和用法是学习C#的第一步。 2. 控制流:掌握if语句、switch...
- 不得使用C语言的保留字(如`int`、`float`等)作为标识符。 - 标识符长度有限制,过长的标识符可能被截断。 2. **常量和变量的定义**: - 变量是在程序执行过程中其值可以改变的实体,如`int a;`定义了一个...
- `float`: 单精度浮点型,适用于精度要求不高的计算。 - `double`: 双精度浮点型,提供更高的精度。 - **字符型(char)**: 用于存储单个字符。 #### 3.2 常量与变量 - **常量**: 在程序执行过程中其值不会发生...
**原则3.8 若不得不使用参数不确定的函数,用提供的方法** - 如果必须使用参数不确定的函数,使用 `<stdarg.h>` 提供的方法。 - 示例:`int vprintf(const char *format, va_list arg);`. **原则3.9 避免函数的参数...
C99标准文档对于C语言开发者来说非常重要,主要体现在以下几个方面: 1. **权威性**:作为C语言的官方标准,C99文档提供了最为准确、详尽的语言特性和用法说明。 2. **规范性**:通过遵循C99标准,开发者可以确保...
Java中,数据类型转换分为自动类型转换(升序转换,如从byte到int)和强制类型转换(可能丢失精度,如从double到int)。转换时需要注意类型兼容性和可能的溢出问题。 【进制表示】 Java中,八进制数以`0`开头,十六...
你难免会遇到各种各样的问题,有些可能让你百思不得其解,甚至翻遍图书馆,也找不到问题的答案。 《你必须知道的495个C语言问题》的出版填补了这一空白。许多知识点的阐述都是其他资料中所没有的,弥足珍贵。 涵盖...
- 实型:`float`、`double` - 逻辑型:`bool` 2. **自定义数据类型** - 数组:`type[]` - 指针:`type*` - 引用:`type&` - 空类型:`void` - 结构:`struct` - 联合:`union` - 枚举:`enum` - 类:`...
- 不得使用C#的关键字作为变量名,如`if`, `else`, `int`, `class`等。 - **使用关键字作为变量名**:可以通过在关键字前面加上`@`符号来避免命名冲突,例如`string @string;`。 - **变量初始化**:C#要求变量在...
- 浮点型:float、double - 字符型:char - 布尔型:boolean **常量书写方式**: - 整型常量:10、-20、077(八进制)、0x1F(十六进制) - 浮点型常量:10.5、-3.14f - 字符型常量:'A'、'\u0041' - 布尔型常量:...
- C++提供了多种内置数据类型,如 `int`, `float`, `double`, `char`, `bool`, 指针、数组和引用等。 **11. 字符类型** - 包括 `char`, `signed char`, `unsigned char`。 - `char`:通常占一个字节。 - `...
- **浮点型**:`float`、`double` - **字符型**:`char` - **构造类型**: - **数组**:如`int arr[10];` - **结构体**:`struct Student { int id; char name[20]; };` - **联合**:`union Data { int i; ...
表达式 `a/b + c + 0.4` 中,`a` 和 `b` 分别为 `int` 和 `float` 类型,`c` 为 `char` 类型,而 `0.4` 是 `double` 类型。在进行加法运算前,`char` 类型会被提升到 `int` 类型,然后所有整数类型都会被提升到 `...