在 c 中转换整个指针后是否有必要转换指针的各个索引?为什么?

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)

Eri*_*hil 5

程序员为什么要这样做呢?

无知、恐惧或其他无能。

的类型ptruint8_t *,所以 的类型ptr[i]uint8_t。将 a 转换uint8_t为 auint8_t没有任何效果。另外,将其放在括号中也没有效果。

如果我们删除初始演员之后的所有演员,会有什么不同吗?

是的,它使代码更小、更清晰。它对程序语义没有影响。

此代码将 IPv4 IP 地址转换为 IP 号码。

不,不,不正确;代码已损坏。

当该uint8_t值与 256 相乘时,将应用通常的算术转换。这些推动uint8_tint,然后*算子的结果是 an int。对于ptr[0],当再执行两次乘以 256 时,结果仍然是int。不幸的是,如果设置了 的高位(位 7)ptr[0],这些乘法会溢出 32 位int。那么程序的行为不是由C标准定义的。

为了避免这种情况,该值应该被转换为uint32_t. (这只是为了使算术正确;我没有断言以这种方式拆开in_addr_t返回的并重新组装它的有用性。)inet_addr