C语言中的强制转换问题,为什么unsigned short dd=5392强制转换成unsigned char的结果是16呢?

来源:百度知道 编辑:UC知道 时间:2024/05/15 03:22:08
unsigned char bnum;
unsigned short dd=5392;
bnum=(char)(dd);
结果值是16,这是为什么?
1.楼下的大哥说的对,但是不是很明白(高低位在VB中如何提取?)因为VB中没有unsigend char类型,请问如何在VB中模拟此过程呢?

2.楼下的大哥,出现运算溢出(顺便说明我用的是VB2005有UShort类型,但是小弟编程经验不够基础不扎实,不吝赐教.)
Dim bnum As Byte
Dim testpp As UShort=5392
bnum = testpp
ListBox1.Items.Add(bnum)

3.高2位:变量 \ 256
低2位:变量 mod 256

不明白,如果高2位=cint(5392\256)的话,结果是21.0625
低2位=5392 mod 256的话,结果是.0625
而C里面出来的结果bnum=(char)(dd); bnum=16

难道VB做不了下面的运算吗?
unsigned char bnum;
unsigned short dd=5392;
bnum=(char)dd;

再次麻烦老兄可以用VB帮我表示一下吗?(上面的过程.)

十进制5392转换为16进制是0x1510,0x1510取最后一个byte就是0x10即16。
c语言里的强制转换可以不用考虑高位低位,编译器会根据编译的机器环境做这个事。

发生了截断,因为unsigned char类型只有1字节,只能保存0~255的数据,而unsigned short 有2字节。

所以这样转换之后,unsigned short 高2位的数据就丢失了,低2位数据被保存了。(高低位是以16进制来看的)

高低位提取:
unsigned short a = 0xFEBA;
int b = a & 0xFF00; /* 高2位=0xFE00 */
int c = a & 0x00FF; /* 低2位=0x00BA */

问题补充:
我用的是VB6,VB2005的UShort忘记考虑了,呵呵。
这样吧,用乘除来达到提取的目的。
检查了一下,应该这样写
高2位:变量 \ (2^8)
低2位:变量 mod (2^8)

一字节有8个bit,所以可以表示2^8个数,就是256,用16进制表示就是0xFF,刚好是2位的宽度。
假设变量是0xABCD,整除2^8,得到0xAB,高2位;余除2^8,得到0xCD,低2位

不知道这样回答对不对?