日期:2014-05-16  浏览次数:20693 次

强制性转换的简单问题 但我就是不懂!!!麻烦大家了!!!
/****************************************************

      inet_ntoa
----------------------------------------------------
Converts   a   IP   address   repersented   in   a   32   bit
unsigned   int   into   a   string
****************************************************/ //1将32位的无符号整型IP地址转换为字符串
char   *inet_ntoa(__u32   ina) //1不懂!!!
{
        static   char   buf[4*sizeof   "123 "];
        unsigned   char   *ucp   =   (unsigned   char   *)&ina; //1把IP地址的值的地址从整型转换成字符型指针
        sprintf(buf,   "%d.%d.%d.%d ", ////把地址设置为XXX.XXX.XXX.XXX的形式
                        ucp[0]   &   0xff, //四个字段,每个字段与上FF,确保数据正确,ucp[0]表示前3位,
                        ucp[1]   &   0xff, //ucp[1]表示接下来的3位,依此类推都 "打印 "到buf里
                        ucp[2]   &   0xff,
                        ucp[3]   &   0xff);
        return   buf;
}


其中     字符型指针ucp[0]-[3]到底有几个字符?  
从buf的定义来看   是个16个字符的字符数组吧
由于%d后有个 ". "那么%d应该是3个字符吧
那为什么unsigned   char   *ucp   =   (unsigned   char   *)&ina;后
ucp指向ina,这样的话,
ucp[0]-[3]每一个只代表3个字符??应该有4个字符啊!!  
这样的话那buf就应该有20个字符了!!!

到底是怎样的啊!!麻烦大家了!!


------解决方案--------------------
> ucp[0]-[3]每一个只代表3个字符??应该有4个字符啊!!
为何这么想?

一个字节的数据换算成10进制最多只有三位,因为最大是255,所以

一个32位整数是四个字节,每个字节转换成一个char,正好放在ucp里面。
举个例子你就明白了,192.168.1.1这个地址存成整数,那么整数的四个字节里面分别存的是(假定字节顺序是我这样):
192, 168, 1, 1
换成16进制是:
0xc0, 0xa8, 0x01, 0x01
那么,
ucp[0] = 0xc0
ucp[1] = 0xa8
ucp[2] = 0x01
ucp[3] = 0x01

.......

似乎太罗嗦了,就不说了,估计你已经明白了:)。