矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 1365|回复: 2

一个c语言类型转换问题请教

[复制链接]
     
发表于 2016-8-2 17:52:09 | |阅读模式
书上一段关于数据压缩算法的代码,简化如下
压缩:    a=(b<<4)|(c&0x0f)     注意,a是有符号char型一个字节,bc都是有符号int双字节,bc是一个比较小的有符号数,4bit内,这句代码中bc都是两个int型的差值,算法本意主要是把本来要存储的很多个(这里假设3个)差不多大的有符号int型数据转换为存一个int初始值和两个差值b和c,然后b和c拼装成char型,这样省出空间,
左看右看有一下几个问题
1:如果b和c这里都是负数,那么一个负数双字节int和0x0f与运算,结果应该是提升为int型,但是符号位是不是没了?
2:拼装完了的int型直接这么赋值给char型的a,代码里都不强制转换下?

解压:
x=a>>4;  
y=a&0x0f;   
if(y>7)  y|=0xfff0;
a是前面拼装的char型,xy是有符号int型,这里也是char直接赋值给int,没有强制类型转换,而且只判断拼装的后面y做符号位扩展,为啥不判断x?
     
发表于 2016-8-2 18:19:08 |
b移位操作时 符号位已经丢失 根据这些代码看不出压缩原理,你应该贴全部的代码
     
 楼主| 发表于 2016-8-2 19:33:52 |
搞定了,顺便解答下。比如b为-1    c为-2,-1即1111 1111  1111 1111 ,-2即1111  1111  1111  1110。b<<4即1111 1111 1111 0000,-2&0x0f为0000 0000 0000 1110。两个或运算即1111 1111 1111 1110,赋值给a后变为1111  1110。
解压,1111  1110>>4即1111 1111赋值给int后为1111 1111 1111 1111即-1。正确还原。1111 1110&0x0f即0000 1110,因为大于7,所以执行后面符号扩展,为1111 1111 1111 1110即-2也正确还原。正数的就不讨论了,简单

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-1 04:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表