错误:从'char *'转换为'unsigned int'会失去精度

时间:2012-06-26 13:06:35

标签: c++ c pointers

我正在编译代码,这使我在以下函数中出错:

inline char *align(char *var, DataType_e type)
{
    return (DataTypeSize[type] == 0) ? var :
        (char*) (((unsigned int)(var) + DataTypeSize[type]-1) /
                 DataTypeSize[type] * DataTypeSize[type]);
}

以下错误符合“(unsigned int)(var)”:

error: cast from 'char*' to 'unsigned int' loses precision

如果我将“unsigned int”更改为“unsigned long”,编译可以正常工作,但在运行程序时我没有得到预期的结果。有关如何解决此问题的任何想法?

3 个答案:

答案 0 :(得分:5)

在C中,如果需要将指针转换为整数类型(但首先应避免使用),则应使用[u]intptr_t

如果存在,这些类型保证不会丢失信息。

答案 1 :(得分:3)

uintptr_t类型与指向POD的指针大小相同。指向其他数据类型的指针,特别是指向成员函数的指针,可能更大。

inline char *align(char *var, DataType_e type)
{
    size_t alignSize = DataTypeSize[type];

    if (1 >= alignSize) {
        return var;
    }

    uintptr_t varInt = reinterpret_cast<uintptr_t>(var);
    varInt = alignSize * ((varInt + alignSize - 1) / alignSize);

    return reinterpret_cast<char *>(varInt);
}

答案 2 :(得分:0)

当您要使用指针进行数学运算时,您应该使用指针算术而不是将指针值转换为'int'或'long',计算并转换回指针。这很容易产生不良结果,因为编译器不能遵守计算的对齐规则。

我很确定你的例子中函数的'意外'结果与演员表完全无关。您应该详细解释使用DataSize[type]值完成的计算以及您希望用它实现的目标。