标题: 请教个C语言长整型的问题 [打印本页]

作者: dzbj    时间: 2018-10-2 12:51
标题: 请教个C语言长整型的问题
unsigned long a;
unsigned char b=1;
unsigned char c;

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

return c;

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

左移和右移8位没问题 16和24都不行 哪位前辈辛苦一下给讲讲

作者: mengzhixinheng    时间: 2018-10-2 16:17
类型不一致,强制转换
作者: cccc888    时间: 2018-10-2 16:50
unsigned char 8位,0-255
??????左移16位,想干嘛?

作者: sxhwdz    时间: 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
作者: 迷一样谦谦公子    时间: 2018-10-2 18:45
长整形的和字符形的转换会很出问题的
作者: dzbj    时间: 2018-10-2 21:18
mengzhixinheng 发表于 2018-10-2 16:17
类型不一致,强制转换

前辈 给讲讲怎么强制转换 以前在书上看过 问题是现在都想不起是哪本书了 惭愧
作者: dzbj    时间: 2018-10-2 21:21
cccc888 发表于 2018-10-2 16:50
unsigned char 8位,0-255
??????左移16位,想干嘛?

我想写个定时程序 比较当前时间和设置时间时遇到跨年的问题 比如起始月是11月 结束月是明年1月 就不能直接对比当前日期>起始日期且<结束日期 所以想用移位的方法 把年月日时放入一个变量里 一个long是4个8位 原本打算年 月 日 分别左移 时到最低位 然后整个对比起始日期和结束日期
作者: dzbj    时间: 2018-10-2 21:22
sxhwdz 发表于 2018-10-2 17:24
b是8位的,左移16次,早就溢出变成0了,因此a=0,a右移16次自然还是0了。
b左移8次,1移入进位标志,一起 ...

谢谢前辈
作者: dzbj    时间: 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值

作者: siduestc    时间: 2018-10-3 08:38
unsigned long a; unsigned char b=1; unsigned char c; a=b<<16; c=a>>16; return c;
作者: siduestc    时间: 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;
作者: 等爱木子    时间: 2018-10-3 10:36
类型不一致,需要强制转换
作者: sxhwdz    时间: 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
作者: petertpi    时间: 2018-10-4 17:54
b你設成unsigned char , 8位元無符號, 左移16位元肯定是0
作者: f1032276    时间: 2018-10-4 19:47
搞成一样的,不要不同长度一起搞
作者: dzbj    时间: 2018-10-4 23:27
sxhwdz 发表于 2018-10-4 08:13
不用那么复杂
如下即可:

感谢回复 明白了
作者: dzbj    时间: 2018-10-4 23:28
回复 14,15楼 感谢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1