1

我正在编译一个代码,这给了我以下函数的错误:

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”,编译工作但我在运行程序时没有得到预期的结果。关于如何解决这个问题的任何想法?

4

3 回答 3

5

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

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

于 2012-06-26T13:37:16.690 回答
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);
}
于 2012-06-26T13:50:03.810 回答
0

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

我很确定您示例中函数的“意外”结果与演员阵容完全无关。您应该更多地解释使用这些DataSize[type]值完成的计算以及您想用它实现什么。

于 2012-06-26T13:16:37.533 回答