将int[2]转换为long
convert int[2] to long
我在32位机器上有一个长int的int[2]表示,我想把它转换成64位机器上的长int。是否有一种独立于体系结构的安全方法来进行这种转换?
源机器是32位的,int是32位的。目的机器是64位的,long long类型肯定是64位的。
我可以做以下事情吗?
long i;
int j[2];
#ifdef LITTLEENDIAN
j[1] = *(int*)(&i);
j[0] = *(((int*)(&i))+1)
#else
j[0] = *(int*)(&i);
j[1] = *(((int*)(&i))+1)
#endif
如果以上是不正确的,那么最好和最安全的方法是什么?我确信这个问题以前会被问到,但我没有找到一个干净的答案。
谢谢
我在32位机器上有一个长int型的int[2]表示,想把它转换成64位机器上的long型。是否有一种独立于体系结构的安全方法来进行这种转换?
没有。因为除了端序之外,这两种数据类型的大小也可能不同。在一些流行的平台上,int
和long
具有相同的大小(都是32位)
最终,这取决于您如何创建int[2]
表示。无论您为创建int
数组所做的是什么,都必须反转,以便从中获得有效的long
。
一种实际可行的方法(但从技术上讲,是未定义的行为)是将两者放在一个联合中:
union {
int i2[2];
long l;
} u;
现在您可以简单地写入u.i2
并从u.l
读取。c++标准在技术上不允许这样做(这是一种未定义的行为),但这是一种常见的技巧,大多数编译器都显式地支持它。
然而,更好的方法可能是使用char[]
而不是int[]
,因为char
被明确地允许别名其他类型。
如果您确定有32位整数和64位整数,那么您可以使用union
概念。
union Convert
{
long i;
int j[2];
};
宽度问题可以通过在两台机器上使用boost::uint64_t来解决。
http://www.boost.org/doc/libs/1_46_1/libs/integer/doc/html/boost_integer/cstdint.html boost_integer.cstdint.exact_width_integer_types
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 从 long 转换C++位集构造函数的复杂性是多少?
- C++11 模板函数"implicity"将位集<N>转换为"unsigned long"
- 替换 c++ 中的 c 样式强制转换 (long&)
- 如何在<typename> <long> 不更改给定代码的情况下将自定义向量与 STL 向量相互转换?
- 隐式转换会丢失整数精度:'long' 到 'int'
- 为什么 int 到长 long int 的隐式转换在 C++ 中给出了意想不到的答案?
- 是否允许在模板专用化时从int转换为long(应该编译此代码)
- 将long-long的数组转换为字符串
- C++11自动.从float转换为long
- C++ 将 int 转换为 *LONG
- 将函数从WCHAR_T数组转换为long int
- 将无符号字符数组强制转换为long-long
- 将 QByteArray 转换为“long”会为相同的输入输出不同的结果
- 如何将双精度转换为标准'long double'
- 将C++字符串变量转换为long
- 为什么从无符号long-long转换为double会导致数据丢失
- C++无法将'long double'转换为'long double*',因为参数'1'为"long
- 在C++中,将double转换为long的类型返回了不正确的值