加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

无符号整型及无符号符号型变量与负数的转换

(2011-09-28 22:34:26)
标签:

类型转换

学习opencv

分类: 《学习OpenCV》笔记
学习OpenCV》笔记1

刚开始读,第二章视频控制的例子,里面有两句代码:
  1. videoFile.read( tempSize , 4 );
  2. int frames = (unsigned char ) tempSize[0] + 0x100*(unsigned char ) tempSize[1] + 0x10000*(unsigned char ) tempSize[2] +    0x1000000*(unsigned char ) tempSize[3];

第一句先不讲,第二句,c语言基础不扎实的我立刻懵了,立刻google。

整型分为无符号、带符号两种,无符号的均表正数,有符号的二进制第一位为1表负数,为0表正数,正数按正常二进制表示,负数存储时遵从以下规则:原码的补码(即原码的反码加1),反码都知道吧,就是二进制原码按位取反。举个例子,比如十进制整型5(32位机器):
原码:00000000 00000000 00000000 00000101
反码:11111111 11111111 11111111 11111010
补码:11111111 11111111 11111111 11111011(-5    反码+1)

现在看上面的代码,调试窗口中看见tempSize四个值分别为-61、1、0、0
-61转为二进制表示为;
原码:00000000 00000000 00000000 00111101 (61)
反码:11111111 11111111 11111111 11000010
补码:11111111 11111111 11111111 11000011 (-61)

(unsigned int)(-61)为 4294967235,即将上述补码的无符号整型转换。
调试时发现(unsigned char)tempSize[0],即(unsigned char )(-61)为195,先是不得其解,后来发现    (-61)的二进制第四个字段11000011恰好是195的二进制表示,想到应该是(unsigned char)类型对数进行了截断,截断为长一个字节的字节型。

为验证又随意取一个大于255的数288验证:
原码:00000000 00000000 00000001 00100000(288)
反码:11111111 11111111 11111110 11011111 
补码:11111111 11111111 11111110 11100000(-288)
1110000为整型244的二进制表示,而调试得到的(unsigned char )(-288)也为244.

用得出的数计算代码中frames=195 + 16 × 16 = 451,为视频帧数。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有