无符号整型及无符号符号型变量与负数的转换
(2011-09-28 22:34:26)
标签:
类型转换学习opencv |
分类: 《学习OpenCV》笔记 |
《学习OpenCV》笔记1
刚开始读,第二章视频控制的例子,里面有两句代码:
- videoFile.read( tempSize , 4 );
- 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,为视频帧数。

加载中…