我正在编译代码,这使我在以下函数中出错:
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”,编译可以正常工作,但在运行程序时我没有得到预期的结果。有关如何解决此问题的任何想法?
答案 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]
值完成的计算以及您希望用它实现的目标。