找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3768|回复: 16
打印 上一主题 下一主题
收起左侧

请教个C语言长整型的问题

[复制链接]
跳转到指定楼层
楼主
ID:47286 发表于 2018-10-2 12:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
unsigned long a;
unsigned char b=1;
unsigned char c;

a=b<<16;
c=a>>16;

return c;

这时候 c返回的是0 是哪里错了

左移和右移8位没问题 16和24都不行 哪位前辈辛苦一下给讲讲
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:89515 发表于 2018-10-2 16:17 | 只看该作者
类型不一致,强制转换
回复

使用道具 举报

板凳
ID:258566 发表于 2018-10-2 16:50 | 只看该作者
unsigned char 8位,0-255
??????左移16位,想干嘛?
回复

使用道具 举报

地板
ID:387733 发表于 2018-10-2 17:24 | 只看该作者
b是8位的,左移16次,早就溢出变成0了,因此a=0,a右移16次自然还是0了。
b左移8次,1移入进位标志,一起赋给a,a=0x100,a右移16次后 a=0x01,所以 c=1

评分

参与人数 1黑币 +10 收起 理由
yousunny + 10 赞一个!

查看全部评分

回复

使用道具 举报

5#
ID:404913 发表于 2018-10-2 18:45 | 只看该作者
长整形的和字符形的转换会很出问题的
回复

使用道具 举报

6#
ID:47286 发表于 2018-10-2 21:18 | 只看该作者
mengzhixinheng 发表于 2018-10-2 16:17
类型不一致,强制转换

前辈 给讲讲怎么强制转换 以前在书上看过 问题是现在都想不起是哪本书了 惭愧
回复

使用道具 举报

7#
ID:47286 发表于 2018-10-2 21:21 | 只看该作者
cccc888 发表于 2018-10-2 16:50
unsigned char 8位,0-255
??????左移16位,想干嘛?

我想写个定时程序 比较当前时间和设置时间时遇到跨年的问题 比如起始月是11月 结束月是明年1月 就不能直接对比当前日期>起始日期且<结束日期 所以想用移位的方法 把年月日时放入一个变量里 一个long是4个8位 原本打算年 月 日 分别左移 时到最低位 然后整个对比起始日期和结束日期
回复

使用道具 举报

8#
ID:47286 发表于 2018-10-2 21:22 | 只看该作者
sxhwdz 发表于 2018-10-2 17:24
b是8位的,左移16次,早就溢出变成0了,因此a=0,a右移16次自然还是0了。
b左移8次,1移入进位标志,一起 ...

谢谢前辈
回复

使用道具 举报

9#
ID:47286 发表于 2018-10-2 22:02 | 只看该作者
sxhwdz 发表于 2018-10-2 17:24
b是8位的,左移16次,早就溢出变成0了,因此a=0,a右移16次自然还是0了。
b左移8次,1移入进位标志,一起 ...

再次感谢前辈提示 说实话我没看懂您说的 但您的提示指示了思路 我试了一下 可以了 但还想再麻烦您和其它前辈看看我写的过程 我觉得自己写的比较笨 更好的写法应该是怎样的

我写的如下
unsigned long a;//需要使用的32位数据
unsigned long x;//用于8位-32位转换的临时变量
unsigned char b=1;//需要使用的8位数据
unsigned char c;//用于输出的8位数据

x=0;//清零一下 因为我不止用这一个变量 这里写的只是个思路
x|=b;//把8位数据转到32位数据
x<<=24;//左移24次 让b数据到最高8位a|=x;//把临时变量x值转到需要使用的32位变量a中
/*到这里 完成8位数据到32位数据的转换过程*/

/*下面是从32位数据转换成8位数据输出*/
x=a;//把在用的32位数据复制到临时变量x中
c=x>>24;//把32位最高8位数据存储到变量b中

return c;//返回c值
回复

使用道具 举报

10#
ID:404980 发表于 2018-10-3 08:38 | 只看该作者
unsigned long a; unsigned char b=1; unsigned char c; a=b<<16; c=a>>16; return c;
回复

使用道具 举报

11#
ID:404980 发表于 2018-10-3 08:39 | 只看该作者
unsigned long a; unsigned char b=1; unsigned char c;a=b; a=a<<16; c=a>>16; return c;
回复

使用道具 举报

12#
ID:405006 发表于 2018-10-3 10:36 | 只看该作者
类型不一致,需要强制转换
回复

使用道具 举报

13#
ID:387733 发表于 2018-10-4 08:13 | 只看该作者
dzbj 发表于 2018-10-2 22:02
再次感谢前辈提示 说实话我没看懂您说的 但您的提示指示了思路 我试了一下 可以了 但还想再麻烦您和其它 ...

不用那么复杂
如下即可:

unsigned long a;
unsigned char b=1;
unsigned char c;

        a=b;              // a=0x00000001
        a=a<<16;     // a=0x00010000
        c=a>>16;     //  c=0x01
回复

使用道具 举报

14#
ID:396450 发表于 2018-10-4 17:54 | 只看该作者
b你設成unsigned char , 8位元無符號, 左移16位元肯定是0
回复

使用道具 举报

15#
ID:405392 发表于 2018-10-4 19:47 | 只看该作者
搞成一样的,不要不同长度一起搞
回复

使用道具 举报

16#
ID:47286 发表于 2018-10-4 23:27 | 只看该作者
sxhwdz 发表于 2018-10-4 08:13
不用那么复杂
如下即可:

感谢回复 明白了
回复

使用道具 举报

17#
ID:47286 发表于 2018-10-4 23:28 | 只看该作者
回复 14,15楼 感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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