注册 登录
编程论坛 C++教室

字符赋给整型量的问题请教一下

洪溪 发布于 2010-11-25 11:46, 1188 次点击
  把几个字符封装到unsigned类型(可装4个字符)里面去  感觉没问题啦怎么输出结果不对啊

#include<iostream>
using namespace std;
int i=0;//记录包装过的字节数

unsigned pack(char chars)
{
    if (i<4)
        i++;//记录包装过的字节数,比如第一次的时候装到第4个字节
    unsigned hold;//暂存字符变量
    unsigned packbody=0;//包装体

    hold=chars;//把字符量交给hold
    hold<<=8*(4-i);//把字符移入packbody中没有记录的地方
    packbody+=hold;
    return packbody;

}//包装函数

template<typename T>
void print( T num)
{
    int mask=1;
    int shift=8*sizeof(T);
    mask<<=shift-1;
    for (int i=0;i<shift;i++)
    {
        if((mask & num)>0)
            cout<<1;
        else
            cout<<0;
        mask>>=1;
    }
    cout<<endl;

}//二进制输出

#include<iostream>
using namespace std;
void main()
{
    char test1='d',test2='b';
    unsigned testnumber;

    pack(test1);
    testnumber=pack(test2);

    print(test1);
    print(test2);
    print(testnumber);
   
}
17 回复
#2
木头lbj2010-11-25 12:29
额。。。不懂。。。。
#3
玩出来的代码2010-11-25 13:58
错误
1.int mask=1,mask是有符号数,你右移31位会是什么值,
2.packbody是局部变量。
3.packbody+=hold,达不到你的要求
#4
pangding2010-11-25 19:26
才读没几行就觉得 packbody+=hold 这語句恐怕对不了。

呵呵,就不细看了,有人答的比我好多了~~
#5
洪溪2010-11-25 21:52
回复 3楼 玩出来的代码
大侠确实非常人也  听你一言真的是醍醐灌顶  我感觉方法是对的但怎么也想不明白 其中的错误..若不是你一语点破我真不知道痛苦到什么时候  你的第1 第2 条指示我同意 但第三条我是对的...谢谢谢谢谢谢你
#6
洪溪2010-11-25 21:54
回复 2楼 木头lbj
呵呵 一起加油朋友
#7
洪溪2010-11-25 21:56
回复 4楼 pangding
呵呵 这是对的 真的 我试过了 不信你再想想
#8
洪溪2010-11-25 22:05
回复 3楼 玩出来的代码
还有 我觉得整形数和无符号数 的差别不就是在最高位的一位嘛  左移之后符号位不就不在了嘛  那俩者不都是一样的吗??  但我试过了 改成整形确实不行  我真想不通其中的奥妙啦  不知大侠能否再赐教赐教啊  感激不尽
#9
pangding2010-11-25 22:23
C 用的是有符号位移运算,符号位的 1 是不会移出的。

那个 += 的我就不想了。不过一般是用 位运算 。不用只能说想法比较奇怪,如果没错误,用也可以。


仔细看了一下,没太看明白,为什么 packbody 不能用局部变量?


[ 本帖最后由 pangding 于 2010-11-25 22:31 编辑 ]
#10
pangding2010-11-25 22:28
其实楼主这个功能可以考虑用一个 union 来替代。
#11
洪溪2010-11-25 22:30
回复 9楼 pangding
哦!!原来是这样的哦!!怪不得啊?? 你真是太棒了!!太感觉你了
#12
洪溪2010-11-25 22:41
回复 10楼 pangding
packbody 这个是局部变量是不是 出了那个函数后 它就被析构函数给消灭啦?? 所以要用全局的 (我是这样想的 但我感觉没把握) 我试过了 不改成全局变量确实不行 做了题目之后才知道那些不起眼的小知识是不能小看的啊!!
#13
pangding2010-11-26 18:25
但是它返回了。它的返回值,你在 main 里不是用 testnumber 接收了吗,这样 packbody 是不是没了根本没有影响呀。
#14
洪溪2010-11-26 20:03
回复 13楼 pangding
真搞不懂了  经常碰到这种看起来很基础但又不明白原理的事
#15
玩出来的代码2010-11-26 20:16
我本想LZ的目的是将两个字符以如下的形式放到一个无符号int型变量中
test1=00001111,test2=11110000
目的变量为0x0F F0 0000H,但LZ的实际行为是  packbody+=hold,不知道是求什么的,没什么道理。
至于局部变量的问题,我想LZ给出明确要求后才好解释。不过看第一次调用pack(test1),若packbody是局部变量,那么这次调用与第二次调用没什么关系,也与结果无关,也就是让他执行了,但结果却简单的抛弃了。
#16
pangding2010-11-26 20:44
嗯,反正他的代码意义不是很明确,导致看着也很糊涂。
#17
洪溪2010-11-27 21:30
回复 15楼 玩出来的代码
呵呵  这一步我是知道用或的 但我一想这个hold只有传入字符的那八个位才有值 其它的都是0
比如hold=1111 1111 0000 0000   pockbody=0000 0000 0000 0000 那相加之后不就像把hold里的字装到pockbody(像一个空箱子)里面一样嘛  (一来加号和装字有很直接的感觉) 我觉得很直观啊   可能思想习惯不同吧
  
  谢谢你 玩出来的代码
 
#18
洪溪2010-11-27 21:33
回复 16楼 pangding
  呵呵 不好意思让你糊糊了
1