一位和我一起工作的实习生向我展示了他在计算机科学方面所进行的关于sorting问题的考试。 有一个问题,显示一个ASCIIstring“我的比萨”,学生必须显示如何将该string将在一个小端计算机上的内存中表示。 当然,这听起来像个诡计的问题,因为ASCIIstring不受endian问题的影响。 但令人震惊的是,实习生声称他的教授坚持认为这个string可以表示为: P-yM azzi 我知道这是不对的。 在任何机器上,ASCIIstring都不会像这样表示。 但显然,教授坚持这一点。 于是,我写了一个小C程序,并告诉实习生把它交给他的教授。 #include <string.h> #include <stdio.h> int main() { const char* s = "My-Pizza"; size_t length = strlen(s); for (const char* it = s; it < s + length; ++it) { printf("%p : %c\n", it, *it); } } 这清楚地表明该string在内存中被存储为“我的比萨”。 一天后,实习生回到我身边告诉我,教授现在声称C正在自动转换地址,以正确的顺序显示string。 我告诉他他的教授疯了,这显然是错的。 但是为了检查我自己的理智,我决定把它发布到stackoverflow上,以便让其他人确认我在说什么。 所以,我问:谁在这里?
Java在其虚拟机中使用的是什么endianness? 我记得在某个地方看到它取决于它正在运行的物理机器,然后我读到的其他地方,我总是相信,它是大端。 哪个是对的?
有没有一种安全,便携的方式来确定(在编译期间)我的程序正在编译的平台的字节序? 我正在写C [编辑]感谢您的答案,我决定坚持与运行时解决scheme!
假设我有数字'numb'=1025 [00000000 00000000 00000100 00000001]代表: Little-Endian机器上: 00000001 00000100 00000000 00000000 在大端机器上: 00000000 00000000 00000100 00000001 现在,如果我在10位上应用左移(即:numb << = 10),我应该有: [A] Little-Endian机器: 正如我在GDB发现的那样,Little Endian在3个步骤中做了左移:[我已经显示'3'步骤来更好地理解处理] 对待没有。 在大尾巴公约中: 00000000 00000000 00000100 00000001 应用左移: 00000000 00010000 00000100 00000000 用Little-Endian再次表示结果: 00000000 00000100 00010000 00000000 [B]。 在大端机器上: 00000000 00010000 00000100 00000000 我的问题是: 如果我直接在小尾巴公约上应用左移,应该给: numb : 00000001 00000100 00000000 00000000 numb << […]
我想存储一些数据到Java中的bytearrays。 基本上只需要每个数字可以占用2个字节的数字。 我想知道如何将一个整数转换为一个2字节长的byterayray,反之亦然。 我发现了很多解决scheme,但是大多数解决scheme都不能解释代码中会发生什么。 有很多转变的东西,我不明白,所以我会很感激一个基本的解释。
我需要编写一个函数来将大端转换为C中的小端。我不能使用任何库函数。
如何在C ++中的big-endian和little-endian之间进行转换? 编辑:为了清楚起见,我必须翻译二进制数据(双精度浮点值和32位和64位整数)从一个CPU架构到另一个。 这不涉及networking,所以ntoh()和类似的function不会在这里工作。 编辑#2:我接受的答案直接适用于我所针对的编译器(这就是为什么我select它)。 但是,这里还有其他非常好的,更便携的答案。