写的代码好高深啊,
unsigned char i=(unsigned char)a;这一句是吧a变量当成是unsigned char 类型(长度为一个字节,就是8位,能表示范围从0-255(0x00-0xff)),而在printf把它打印的是用的是%08x,应该是按十六进制输出,当成一个int类型的数,而i只有一个字节长度,所以用符号位(0)填。至于08记不太清了。
char *b=(char*)&a;这一句是取a的地址然后解引用为指向char类型的指针,但其实内存内在没有发生任何变化,所以当使用prinf把它输出,应该%x最后还是会把*b内容当成int*因为你没用%c这一个转换(不确定是这么叫么)。
还有最后一点,很重要的,您的程序在不同的操作系统底下编译出来应该也会不一样,例如windows操作系统是大尾的系统,它会把数据的高字节放在连续储存区域的首位,而Linux这样的系统却是小尾系统,做的事情刚好想法,所以你的程序在不同系统中编译出来结果还会不一样。
void main()
{
unsigned int a=0xfffffff7;
unsigned char i=(unsigned char)a;
char*b=(char*)&a;
printf("%08x,%04x\n",i,*b);
}
对于这个程序,i只相当于做了一个强制转化,由于unsigned char只有8位,所以截取了最低位16进制的f和7即8位。对于*b,这样理解,考虑赋值语句*b = &a;则b是a内存中的地址即指针,*b是此地址上的值。加上一个强制转换(char *)的意思是将改地址转换为char类型的地址,并不会截取,所以*b会取得a的值。
这个a转换到字符类型越界了
这是msdn中的整数转换到字符串的说明:
_itoa, _i64toa, _ui64toa, _itow, _i64tow, _ui64tow
Convert an integer to a string.
char*_itoa(intvalue,char*string,intradix);
char *_i64toa(__int64value,char*string,intradix);
char*_ui64toa(unsigned_int64value,char*string,intradix);
wchar_t*_itow(intvalue,wchar_t*string,intradix);
wchar_t*_i64tow(__int64value,wchar_t*string,intradix);
wchar_t*_ui64tow(unsigned __int64value,wchar_t*string,intradix);
Routine Required Header Compatibility
_itoa
_i64toa
_ui64toa
_itow
_i64tow
_ui64tow
你可以转换之后,进行相加,然后复制给字符数组
char最大为128 也就是0x80 只要最后两位大于80都会直接全打印 因为认不出char 小于80就原样打印char 不满位的补零
结果是00000078;0078
在这里*b相当于做了一次强制转换,其结果是0x78
所以他的结果等同于printf("%08x,%04x",char(a),char(a));