最近用51单片机写一个程序,将 unsigned long int转换为 四个 unsigned char,可是高16位转换总是为零。程序如下:
unsigned int page;
unsigned long int Recode;
unsigned char WRflash[20];
page=1281;
Recode=page*264;
WRflash[0]=(Recode/65536)/256;
WRflash[1]=(Recode/65536)%256;
WRflash[2]=(Recode%65536)/256;
WRflash[3]=(Recode%65536)%256;
WRflash[0],WRflash[1]总是为零,请各位技术大牛看看,哪里有问题,请多多指教。
第1个回答 2011-09-23
1,最简单的办法是定义一个联合,这样不用计算,直接去拿数就可以了。
2,用移位的方法
unsigned long int a;
a = Recode;
WRflash[0] = a & 0x000000FF;
a >>= 8;
WRflash[1] = a & 0x000000FF;
a >>= 8;
WRflash[2] = a & 0x000000FF;
a >>= 8;
WRflash[3] = a & 0x000000FF;
2,用移位的方法
unsigned long int a;
a = Recode;
WRflash[0] = a & 0x000000FF;
a >>= 8;
WRflash[1] = a & 0x000000FF;
a >>= 8;
WRflash[2] = a & 0x000000FF;
a >>= 8;
WRflash[3] = a & 0x000000FF;
第2个回答 2011-09-23
本来就该是0吧。
第一个:
Recode/65536=4
4/256 当然等于0咯
/号表示的意思是去商。 4/246不够除,当然取0咯
第二个就不知道了。应该等于4的啊追问
第一个:
Recode/65536=4
4/256 当然等于0咯
/号表示的意思是去商。 4/246不够除,当然取0咯
第二个就不知道了。应该等于4的啊追问
WRflash[1]不应该为零的,可是每次都是零;
追答那确实。
第3个回答 2011-09-25
unsigned long int Recode;
unsigned char WRflash[3];
void main()
{
Recode=0x01020304;
WRflash[0]=((unsigned char *)&Recode)[3];
WRflash[1]=((unsigned char *)&Recode)[2];
WRflash[2]=((unsigned char *)&Recode)[1];
WRflash[3]=((unsigned char *)&Recode)[0];
}这样也可以应该追问
unsigned char WRflash[3];
void main()
{
Recode=0x01020304;
WRflash[0]=((unsigned char *)&Recode)[3];
WRflash[1]=((unsigned char *)&Recode)[2];
WRflash[2]=((unsigned char *)&Recode)[1];
WRflash[3]=((unsigned char *)&Recode)[0];
}这样也可以应该追问
谢谢。原程序中的Recode的值必须由page传递,page是个全局变量,我上面page的值只是为了举例说明,我想问一下,Recode的值是不是经过page的运算后先变成了unsigned int,,赋值给Recode的时候高十六位就变成了零,因为page是unsigned int。
追答Recode=page*264;这条运算之后REcode还是属于长整型,你可以先调试看看是什么类型的运算之后,但是page*264的值应该是属于unsigned int这个范围的,其他也不是很清楚,最好通过调试看看,
本回答被提问者采纳