使用程序获取整型数据和浮点型数据在内存中的表示---gyy整理
来源:互联网 发布:网络人旗舰版注册 编辑:程序博客网 时间:2024/06/11 21:43
使用程序获取整型数据和浮点型数据在内存中的表示。
C++中整型(int)、短整型(short int)、单精度浮点数(float)、双精度浮点数(double)在内存中所占字节数不同,因此取值范围也不同。
例如(vc++6.0编译环境下)
short int a=2; //此时短整型a在内存中占2个字节
int b=2;//此时整型b在内存中占4个字节
并且有符号(signed)的整型存放数的二进制补码(正数的原码、反码、补码都相同,负数的补码是对应的反码加1),最高位为符号位,其余为数值位。
无符号(unsigned)的整型存放的都是0和正数,即无符号整型中不能存放负数,所以不存在符号位,所以所有位都是数值位。
整型数和浮点数在内存中的存储方式也是不同的,浮点数在内存中的存储分为尾数和阶码(指数),所以即使int和float数都在内存中占4个字节,但表数范围是完全不同的。
例如:作为整数的19和作为浮点数的19.0在内存中的编码是完全不同的,就因为计算机在处理整数和浮点数的方式是不同的。
(1)以下程序来查看float类型的数据在内存中的表示。
方法1:
//查看float类型的变量在内存中的存储方式#include<iostream>using namespace std;int main(){int i;float f; cout<<"float单精度浮点数在计算机内存中储存格式如下:"<<endl; cout<<"1位符号位,8位表示指数,23位表示尾数"<<endl<<endl; cout<<"请输入一个单精度浮点数(float):";cin>>f;unsigned int*pa =(unsigned int*)(&f);cout<<"float类型的浮点数"<<f<<"在内存的存储方式为:"<<endl; for(i=31;i>=0;i--)cout<<(*pa>>i & 1)<<(i==31||i==23?"-":" ");cout<<"\n";return 0;}运行结果
方法2
//查看float类型数据在内存中的存储方式#include<iostream>using namespace std;void binary_print( unsigned char c) { for(int i = 0; i < 8; ++i) { if((c << i) & 0x80) cout << '1'; else cout << '0'; } cout << ' '; } int main(){float a;unsigned char c_save[4];int i;void *f;f = &a; cout<<"float单精度浮点数在计算机内存中储存格式如下:"<<endl; cout<<"1位符号位,8位表示指数,23位表示尾数"<<endl<<endl; cout<<"请输入一个浮点数:";cin>>a;cout<<endl;for(i=0;i<4;i++){c_save[i] = *(( unsigned char*)f+i);}cout<<"float类型的浮点数"<<a<<"在计算机内存中储存格式如下:"<<endl;for(i=4;i!=0;i--)binary_print(c_save[i-1]); cout<<endl;return 0;}运行结果
(2)以下程序来查看double类型的数据在内存中的表示。
//查看double型浮点数在内存中的存储形式#include<iostream>using namespace std;void binary_print( unsigned char c) { for(int i = 0; i < 8; ++i) { if((c << i) & 0x80) cout << '1'; else cout << '0'; } cout << ' '; } int main(){double d;unsigned char c_save[8];int i;void *f;f = &d;cout<<"double双精度浮点数在计算机内存中储存格式如下:"<<endl; cout<<"1位符号位,11位表示指数,52位表示尾数"<<endl<<endl; cout<<"请输入一个双精度浮点数(double):";cin>>d;cout<<endl;for(i=0;i<8;i++){c_save[i] = *(( unsigned char*)f+i);}cout<<"双精度浮点数"<<d<<"在计算机内存中储存格式如下:"<<endl;for(i=8;i!=0;i--)binary_print(c_save[i-1]); cout<<endl;return 0;}运行结果
从上两个例子可以看出float的17.625与double的17.625在内存中存放的字节数不同,存储格式也不同。
(3)以下程序来查看多种类型的数据在内存中的表示。
方法1
//C++中整型和单精度浮点数在内存中所占字节数不同,取值范围也不同//以下程序来查看不同类型的数据在内存中的表示#include <iostream>using namespace std;int main(){int i;int sa;cout<<"请输入一个短整数(-32768~32767) sa=";cin>>sa;int *psa=reinterpret_cast<int *>(&sa);cout<<sa<<"在内存中的存储形式为: ";for( i=15;i>=0;i--)cout<<(*psa>>i&1)<<(i==8?" ":"");cout<<endl<<endl;int a;cout<<"请输入一个整数 a=";cin>>a;int *pa=reinterpret_cast<int *>(&a);cout<<a<<"在内存中的存储形式为: ";for( i=31;i>=0;i--)cout<<(*pa>>i&1)<<(i==24||i==16||i==8?" ":"");cout<<endl<<endl;float f;cout<<"请输入一个正浮点数(单精度) f=";cin>>f;int *pf=reinterpret_cast<int *>(&f);cout<<f<<"在内存中的存储形式为: ";for( i=31;i>=0;i--)cout<<(*pf>>i&1)<<(i==24||i==16||i==8?" ":"");cout<<endl;cout<<"按数符(1位)-指数(8位)-尾数(23位)显示为:"<<endl;for( i=31;i>=0;i--)cout<<(*pf>>i&1)<<(i==31||i==23?" ":"");cout<<endl<<endl; float ff;cout<<"请输入一个负浮点数(单精度) ff=";cin>>ff;int *pff=reinterpret_cast<int *>(&ff);cout<<ff<<"在内存中的存储形式为: ";for( i=31;i>=0;i--)cout<<(*pff>>i&1)<<(i==24||i==16||i==8?" ":"");cout<<endl;cout<<"按数符(1位)-指数(8位)-尾数(23位)显示为:"<<endl;for( i=31;i>=0;i--)cout<<(*pff>>i&1)<<(i==31||i==23?" ":"");cout<<endl;return 0;}
运行结果
方法2
//C++中整型和单精度浮点数在内存中所占字节数不同,取值范围也不同//以下程序来查看不同类型的数据在内存中的表示#include<iostream>using namespace std;void binary_print( unsigned char c) { for(int i = 0; i < 8; ++i) { if((c << i) & 0x80) cout << '1'; else cout << '0'; } cout << ' '; } int main(){unsigned char c_save[8];int i;void *f;//short int整型数的存储int sn;f = &sn; cout<<"请输入一个短整型数(short int):";cin>>sn;cout<<endl;for(i=0;i<2;i++){c_save[i] = *(( unsigned char*)f+i);}cout<<"short int类型的整数"<<sn<<"在计算机内存中储存格式如下:"<<endl;for(i=2;i!=0;i--)binary_print(c_save[i-1]); cout<<endl<<endl; //int整型数的存储int n;f = &n; cout<<"请输入一个整型数(int):";cin>>n;cout<<endl;for(i=0;i<4;i++){c_save[i] = *(( unsigned char*)f+i);}cout<<"int类型的整数"<<n<<"在计算机内存中储存格式如下:"<<endl;for(i=4;i!=0;i--)binary_print(c_save[i-1]); cout<<endl<<endl; //float单精度浮点数的存储float a;f = &a; cout<<"float单精度浮点数在计算机内存中储存格式如下:"<<endl; cout<<"1位符号位,8位表示指数,23位表示尾数"<<endl<<endl; cout<<"请输入一个单精度浮点数(float):";cin>>a;cout<<endl;for(i=0;i<4;i++){c_save[i] = *(( unsigned char*)f+i);}cout<<"float类型的浮点数"<<a<<"在计算机内存中储存格式如下:"<<endl;for(i=4;i!=0;i--)binary_print(c_save[i-1]); cout<<endl<<endl; //double双精度浮点数的存储 double d;f = &d;cout<<"double双精度浮点数在计算机内存中储存格式如下:"<<endl; cout<<"1位符号位,11位表示指数,52位表示尾数"<<endl<<endl; cout<<"请输入一个双精度浮点数(double):";cin>>d;cout<<endl;for(i=0;i<8;i++){c_save[i] = *(( unsigned char*)f+i);}cout<<"双精度浮点数"<<d<<"在计算机内存中储存格式如下:"<<endl;for(i=8;i!=0;i--)binary_print(c_save[i-1]); cout<<endl<<endl;return 0;}
运行结果
补充:
(1)举例将17.625换算成 float型【转】
首先,将17.625换算成二进制位:10001.101 ( 0.625 = 0.5+0.125, 0.5即 1/2, 0.125即 1/8 如果不会将小数部分转换成二进制,请参考其他书籍。) 再将10001.101 向右移,直到小数点前只剩一位 成了 1.0001101 x 2的4次方(因为右移了4位)。此时 我们的底数M和指数E就出来了:
底数部分M,因为小数点前必为1,所以IEEE规定只记录小数点后的就好,所以此处底数为 0001101 。
指数部分E,实际为4,但须加上127,固为131,即二进制数10000011
符号部分S,由于是正数,所以S为0.
综上所述,17.625的 float 存储格式就是:
0 10000011 00011010000000000000000
转换成16进制:0x41 8D 00 00
所以,一看,还是占用了4个字节。
(2)void类型
void的含义
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void真正发挥的作用在于:对函数返回的限定; 对函数参数的限定。
void的使用
下面给出void关键字的使用规则:
规则一:如果函数没有返回值,那么应声明为void类型
在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void类型
我们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值,一定要声明为void类型。这既是程序良好可读性的需要,也是编程规范性的要求。另外,加上void类型声明后,也可以发挥代码的“自注释”作用。代码的“自注释”即代码能自己注释自己。
规则二:如果函数无参数,那么应声明其参数为void
规则三:小心使用void指针类型
按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作
规则四:如果函数的参数可以是任意类型指针,那么应声明其参数为void
规则五:void不能代表一个真实的变量
void体现了一种抽象,这个世界上的变量都是“有类型”的,譬如一个人不是男人就是女人(还有人妖?)。
void的出现只是为了一种抽象的需要,如果你正确地理解了面向对象中“抽象基类”的概念,也很容易理解void数据类型。正如不能给抽象基类定义一个实例,我们也不能定义一个void(让我们类比的称void为“抽象数据类型”)变量。
(3)
转自百度
reinterpret_cast
reinterpret_cast<char*>(&st)
第1.
第2.
第3.
C形式的类型转换的问题就是它太强大了, 强大就容易被滥用,滥用的结果就是类型检查形同虚设。 所以C++推荐用新形式的,比较弱些的转换, 确保你知道你自己在做什么而不是对所有类型不匹配用一个转换了事
- 使用程序获取整型数据和浮点型数据在内存中的表示---gyy整理
- 小结 | 整型和浮点型数据在内存中的存储
- 浮点型数据在内存中的存储
- 浮点型数据在内存中的存储
- 深剖整型与浮点型数据在内存中的存储
- C系列总结2 & 剖析整型、浮点型数据在内存中的存储
- 浮点型和整型在内存中的存储方式
- doble型数据在内存中的表示
- 整型数据和字符串数据在内存中的存放
- 整型数据和字符串数据在内存中的存放
- 浮点型数据在内存中存储的表示
- 浮点型数据在内存中存储的表示[转载]
- 浮点型数据在内存中存储的表示
- 浮点型数据在内存中存储的表示
- 浮点型数据在内存中存储的表示[转载]
- 浮点型数据在内存中存储的表示
- 数据在内存中的二进制表示和IEEE754
- 使用头文件climits中的符号常量获知整型数据的表数范围---gyy整理
- js dwz框架 多页面id,函数名称冲突问题
- Template Method模式
- FireFox每次访问页面时检查最新版本
- Eclipse 下如何使用svn
- Codeforces #205 Div.2 Problem C - Find Maximum
- 使用程序获取整型数据和浮点型数据在内存中的表示---gyy整理
- android程序显示默认图标问题
- ajax请求时的缓存问题
- 都要学C-- char3
- nim server 0042-061 resource is currently allocated for client use
- ArchLinux禁用PGP签名检查
- java 基础积累
- mongodb与mysql命令对比
- 数字接口(续)——I2C 总线