确定整数在阵列中的末端
Determining endianness of integers in array
我的代码应该检测到我数组中存储的整数是否为大eNDIAN还是小eNdian订单。
这是我的代码:
#include <iostream>
using namespace std;
int main()
{
int num[] = {0,0,0x04030201,0,0};
//int num = 0x04030201;
for (int i=0;i<5;i++) {
if(*(char *)&num[i] == 1) {
printf("nLittle-Endiann");
}
else {
printf("Big-Endiann");
}
}
return 0;
}
由于我的计算机是Intel,因此所有数字都应存储在Little Endian中。这意味着我希望代码能够通过我的数组中的每个整数并打印出小endian,因此它应该只打印小endian 5次。但这是我目前正在获得的输出:
Big-Endian
Big-Endian
我该如何修复?
您无法测试任意或未知值的终点。如果int
的所有字节为零,那么它们的顺序都没关系。
您的代码打印
Big-Endian
Big-Endian
Little-Endian
Big-Endian
Big-Endian
正如我的X86-64系统上预期的那样,因为您的测试方法是错误的。您的问题使它听起来像始终打印的大型!
您的数组元素中只有一个将1
作为该值的最小字节。(int)0
的全零字节当然不是== 1
。
您无法使用所有字节具有相同值的数字检查endianness,因为无论endianness如何加载相同的值。
== 1
检查适用于0x04030201
,因为该值的低字节为1
。它一般不起作用。您可以同样地执行0x4455667788
中的== 0x88
,以查看内存中的第一个字节是否为0x88
字节。
(我说的是"字节"而不是char
,因为我们谈论的是X86-64,它确实具有8位字节,所有主流C 实现都使用1字节char
和32位int
。(
如何修复
endianness是某个目标体系结构实现的属性,并且对于不同的数组元素不能有所不同。
int endian_test = 0x12345678;
char *p = (char*)&endian_test;
const char *endian_string = "unknown endian";
if (p[0] == 0x78 && p[1] == 0x56 && p[2] == 0x34 && p[3] = 0x12)
endian_string = "Little-Endian";
if (p[3] == 0x78 && p[2] == 0x56 && p[1] == 0x34 && p[0] = 0x12)
endian_string = "Big-Endian";
// test for PDP-endian if you want
for (int i=0;i<5;i++) {
// It's guaranteed that all elements of the array have the same endianness as endian_test
puts(endian_string);
}
大而小的不是唯一的终点。
还要注意,您可以使用CPP宏检测并检测到这一点。GCC至少提供可让您做
的宏#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
...
#else
#endif
但是这些宏不是ISO C 标准。"运行时"检查可以将其优化为一无所有(因为结果是编译时间常数是true或fals(,但是预处理器可以让您禁用甚至不会编译的代码。
在C 20中,使用std::endian
type_traits
。
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 将25个甚至整数存储到一个名为intlist的整数阵列中,然后在屏幕上显示数组,并在屏幕上显示名为fivintegers
- 确定整数在阵列中的末端
- 我如何将整数转换为存储在字符阵列中的十六进制字节
- scanf()仅用于阵列的第一个整数
- Visual如何将文件与整数一起使用到阵列C 中
- 如何将整数存储在字符阵列中
- Char阵列中的特定索引的C 拉动签名整数
- 整数阵列合并排序比QuickSort快
- 将整数从for循环存储在全球阵列中
- 计算以毫秒为单位的分类算法对整数阵列排序的时间
- 将整数转换为阵列(包括领先的零),而无需使用字符串
- 整数的阵列比较
- C 2字节阵列计算(char阵列,字符串和整数)
- 在尺寸N的未排序阵列中找到最小的整数
- 阵列索引(转换为整数)用范围枚举
- visual C++将整数的二维数组插入到另一个整数的二维阵列中