moh*_*549 -3 c c++ pointers casting
在下面的代码中,ip 地址被转换为 uint8_t *。但下面再次将强制转换指针的每个索引强制转换为 uint8_t。程序员为什么要这样做呢?如果我们删除初始演员之后的所有演员,会有什么不同吗?此代码将 IPv4 IP 地址转换为 IP 号码。谢谢
uint32_t Dot2LongIP(char* ipstring)
{
uint32_t ip = inet_addr(ipstring);
uint8_t *ptr = (uint8_t *) &ip;
uint32_t a = 0;
if (ipstring != NULL) {
a = (uint8_t)(ptr[3]);
a += (uint8_t)(ptr[2]) * 256;
a += (uint8_t)(ptr[1]) * 256 * 256;
a += (uint8_t)(ptr[0]) * 256 * 256 * 256;
}
return a;
}
Run Code Online (Sandbox Code Playgroud)
程序员为什么要这样做呢?
无知、恐惧或其他无能。
的类型ptr是uint8_t *,所以 的类型ptr[i]是uint8_t。将 a 转换uint8_t为 auint8_t没有任何效果。另外,将其放在括号中也没有效果。
如果我们删除初始演员之后的所有演员,会有什么不同吗?
是的,它使代码更小、更清晰。它对程序语义没有影响。
此代码将 IPv4 IP 地址转换为 IP 号码。
不,不,不正确;代码已损坏。
当该uint8_t值与 256 相乘时,将应用通常的算术转换。这些推动uint8_t到int,然后*算子的结果是 an int。对于ptr[0],当再执行两次乘以 256 时,结果仍然是int。不幸的是,如果设置了 的高位(位 7)ptr[0],这些乘法会溢出 32 位int。那么程序的行为不是由C标准定义的。
为了避免这种情况,该值应该被转换为uint32_t. (这只是为了使算术正确;我没有断言以这种方式拆开in_addr_t返回的并重新组装它的有用性。)inet_addr
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |