将long int*转换为long long int*
Convert long int* to long long int*
在我的平台上,long int和long long int都是相同的(64位)。我有一个指向长整型的指针我想把它转换成指向长整型的指针。下面的代码
static_cast<long long int*>(pointer);
不允许。在c++ 11中,正确的方法是什么?
必须强制'重新解释'指针:
reinterpret_cast<long long int*>(pointer);
这样的强制转换意味着编译器"停止检查,我知道如何更好地解释该表达式中的二进制数据"。因此,无论何时制作reinterpret_cast
-检查两次你的平台知识,内存对齐等。编写一些简单的单元测试等,通过valgrind或地址消毒程序运行它们。
所以现在想想,如果你真的需要强制转换这样的指针。通常重新设计函数等可以解决此类问题(例如,如果您只需要指向值的数据-将其存储在一些附加变量中等)。
你也可以尝试强制编译器做一些检查:
template <typename Dest, typename Src>
Dest* safe_pointer_cast(Src* src)
{
static_assert(sizeof(Src) == sizeof(Dest), "size of pointed values differ");
static_assert(alignof(Src) == alignof(Dest), "alignment different");
return reinterpret_cast<Dest*>(src);
}
你可以用一种便携的方式使用额外的存储空间:
long* ptr = /***/;
long long extra_storage = *ptr;
long long* long_ptr = &extra_storage;
没有额外的存储空间,但有编译时检查:
static_assert(sizeof(long) == sizeof(long long));
long* ptr = /***/;
long long* long_ptr = reinterpret_cast<long long*>(ptr);
相关文章:
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- 错误:将"long int (*)[4]"分配给"long int [4][4]"时的类型不兼容
- 如何处理计算中的"unsigned long long int"?
- 为什么所有可能的整数都"true"在 C++ 的 if 语句内的 long int 范围内,而 0 不是?
- 为什么 int 到长 long int 的隐式转换在 C++ 中给出了意想不到的答案?
- C++为什么字符串的地址尽管是十六进制格式,但不能存储在 long int 变量中?
- "long int a=2"和"int a=2L"有什么区别?
- "long"和"long int"以及"long long"与"long long int"有什么区别
- map(long long int,long long int)不适用于key=1000 000 000(在long l
- C sqrt == long int
- 将函数从WCHAR_T数组转换为long int
- 性能从 'int' 显著降低到 'long int'
- 奇怪的并行循环行为 int v long int
- C++ Long Long INT - 64 位,此限制仅使用 64 位操作系统
- 二进制'operator%' 'long long int'类型的操作数无效
- long/int到UINT64的转换,并在C#上返回long-何时可以丢失数据
- "unsigned long int" c++ 中的最大值
- v[long long int] in C++
- C++ long long int