整数的二进制存储问题(以 short 和 unsigned short 为例)

今天折腾的好久 二进制的问题 我们先看下面的小例子和结果 (运行环境为vs2010)

     

 short i1=32767;
	short i2=32768;
	short i3=32769;
	short i4=-32768;
	short i5=-32769;

	cout<<i1<<endl;  //32767
	cout<<i2<<endl;  //-32768
	cout<<i3<<endl;  //-32767
	cout<<i4<<endl;  //-32768
	cout<<i5<<endl;  //32767

	unsigned 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;  //65535
	cout<<j2<<endl;  //0
	cout<<j3<<endl;  //1
	cout<<j4<<endl;  //1
	cout<<j5<<endl;  //0
	cout<<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 表达的数是多少 这是 所有问题的转折点了






  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值