整数的二进制存储问题(以 short 和 unsigned short 为例)
来源:互联网 发布:电脑手机码字软件 编辑:程序博客网 时间:2024/05/22 10:04
short i1=32767;short i2=32768;short i3=32769;short i4=-32768;short i5=-32769;cout<<i1<<endl; //32767cout<<i2<<endl; //-32768cout<<i3<<endl; //-32767cout<<i4<<endl; //-32768cout<<i5<<endl; //32767unsigned short j1=65535;unsigned short j2=65536;unsigned short j3=65537;unsigned short j4=-65535;unsigned short j5=-65536;unsigned short j6=-1;cout<<j1<<endl; //65535cout<<j2<<endl; //0cout<<j3<<endl; //1cout<<j4<<endl; //1cout<<j5<<endl; //0cout<<j6<<endl; //65535
计算机基础知识不扎实 想了半天 查了半天资料 才基本摸清楚(若有问题 希望有人能给我讲一下 )
首先 对于 signed short 其 共有16个字节(对于我的机子是这样的) 第一位是符号位
注意在计算机中 整形是用的 补码进行存储 正数的补码就是他自己 负数的补码 是其除符号位以外 其他各位求反后 ,最后位再加一
对于有符号的 第一位 为符号位 0为正 1为负
利用补码可以拓宽整数的下界 即若用原码表达 (位数为8时 )最小值 为 1111 1111 1111 1111值为 -127 其补码为1000 0000 0000 0001
大家可以很清楚的看到 补码还可以再减一的 (即-127-1=-128)为 1000 0000 0000 0000.
其表达数字的范围为 1000 0000 0000 0000-------0111 1111 1111 1111 故 其范围为 -32768---32767
所以对于上面输入的 i1 , i4结果就很清楚
那么对于 i2 : 0111 1111 1111 1111 +1 计算其值为 1000 0000 0000 0000 为 -32768
对于 i3 : 1000 0000 0000 0000 +1 计算其值为 1000 0000 0000 0001 因为是补码 所以 换为原码就是1111 1111 1111 1111 即为 -32767
对于i5 : 1000 0000 0000 0000 -1 计算其值为 0111 1111 1111 1111 正数的补码还是自己 所以 其值就是 32767
好了 对于有符号的搞清楚了 对于无符号的 就简单多了 无符号的 能表达的范围 为 0000 0000 0000 0000-------1111 1111 1111 1111 即 0---65535
对于 j1 不解释
对于 j2 1111 1111 1111 1111 + 1 =0000 0000 0000 0000 第一位越界被解掉了
对于 j3 再加1而已 不解释
对于 j4 -65535 (事实上不存储 越界的位数 这里我们借一位 作解释) 原码 为 1 1111 1111 1111 11111 其补码为 1 0000 0000 0000 0001
然后截掉第一位 剩下的为 0000 0000 0000 0001 值就为1了
对于 j5 若按上面的方法 其补码为 1 0000 0000 0000 0000 截掉第一位 值为0 或是 用 -65535-1 =1-1=0
对于 j6 其原码 为 1000 0000 0000 0001 补码为 1111 1111 1111 1111 值为 65535
嗯 差不多解释成这样了 关键是要搞明白 有符号时的 1000 0000 0000 0000 表达的数是多少 这是 所有问题的转折点了
- 整数的二进制存储问题(以 short 和 unsigned short 为例)
- C++ 整数(0,1,2,3)和WORD(unsigned short)的区别
- bind port打印时:short 和 unsigned short的区别
- 翻转一个short 和int的整数;
- [C++] short强转unsigned int引发的问题
- VC++2005中的unsigned short和wchar_t
- VC++2005中的unsigned short和wchar_t
- VC++2005中的unsigned short和wchar_t
- VC++2005中的unsigned short和wchar_t
- VC++2005中的unsigned short和wchar_t
- VC++2005中的unsigned short和wchar_t
- VC++2005中的unsigned short和wchar_t
- VC++2005中的unsigned short和wchar_t
- VC++2005中的unsigned short和wchar_t
- VC++2005中的unsigned short和wchar_t
- VC++2008中的unsigned short和wchar_t
- CUDA 纹理 unsigned char转化为unsigned short
- String转换为short[]的整个过程——以汉字“王”为例
- 自适应网页设计(Responsive Web Design)
- KMP算法
- TCP/IP Scoket编程之UDP聊天室(C语言实现)
- Oracle Database 9i/10g/11g编程艺术:深入数据库体系结构
- 5月8日第十二周实验报告(三)虚基类的好处
- 整数的二进制存储问题(以 short 和 unsigned short 为例)
- 菜鸟从零开始的第一个应用上线记(五)
- SQLserver2008数据源创建失败的解决方案
- 第十二周报告四
- vc2010多线程使用std标准模板库容器DEBUG版迭代器BUG
- 控件拉伸(转)
- 派出所所长到互联网架构师的传奇人生
- 让Oracle跑得更快:Oracle 10g性能分析与优化思路
- 来自java文档 Socket类