我们最近在大学里开了一个关于多种语言编程特色的讲座.
讲师写下了以下功能:
inline u64 Swap_64(u64 x)
{
u64 tmp;
(*(u32*)&tmp) = Swap_32(*(((u32*)&x)+1));
(*(((u32*)&tmp)+1)) = Swap_32(*(u32*) &x);
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
虽然我完全理解这在可读性方面也是非常差的风格,但他的主要观点是这部分代码在生产代码中运行良好,直到它们实现了高优化级别.然后,代码将什么都不做.
他说,变量的所有赋值tmp都将由编译器优化.但为什么会这样呢?
我知道有些情况下变量需要声明为volatile,这样编译器就不会触及它们,即使他认为它们永远不会被读或写,但我不知道为什么会发生这种情况.
我有一个Floats数组需要转换为字节数组并返回到float [] ...任何人都可以帮我正确地执行此操作吗?
我正在使用bitConverter类,发现自己试图追加结果.
我这样做的原因是我可以将运行时值保存到IO流中.如果重要,目标存储是Azure页面blob.我不关心它存储在哪个endian,只要它输入与输出匹配.
static byte[] ConvertFloatToByteArray(float[] floats)
{
byte[] ret = new byte[floats.Length * 4];// a single float is 4 bytes/32 bits
for (int i = 0; i < floats.Length; i++)
{
// todo: stuck...I need to append the results to an offset of ret
ret = BitConverter.GetBytes(floats[i]);
}
return ret;
}
static float[] ConvertByteArrayToFloat(byte[] bytes)
{ //to do }
Run Code Online (Sandbox Code Playgroud) 在大约40年的二进制计算机科学之后,为什么今天仍然使用小端和大端?是否有算法或存储格式与另一个更好地工作?如果我们都切换到一个并坚持下去,那不是更好吗?
我最近一直在问自己的一个真正的问题是,设计选择带来了x86是一个小端架构而不是大端架构?
我试过四处寻找,但一直没能找到关于二进制文字和字节序的东西.二进制文字是little-endian,big-endian还是其他什么东西(比如匹配目标平台)?
举个例子,十进制值是0b0111多少?是7吗?平台具体?别的什么?编辑:我选择了一个错误的值7,因为它表示在一个字节内.尽管如此,这个问题仍得到了充分的回答.
一些背景:基本上我试图找出最低有效位的值是什么,并用二进制文字掩盖它似乎是一个很好的方法...但只有在有一些关于字节序的保证.
和我一起工作的实习生向我展示了他在计算机科学方面考试的关于字节序问题的考试.有一个问题显示ASCII字符串"My-Pizza",学生必须显示该字符串将如何在小端计算机的内存中表示.当然,这听起来像一个技巧问题,因为ASCII字符串不受端序问题的影响.
但令人震惊的是,实习生声称他的教授坚持认为该字符串将表示为:
P-yM azzi
Run Code Online (Sandbox Code Playgroud)
我知道这不可能是正确的.在任何机器上都不能像ASCII字符串那样表示ASCII字符串.但显然,教授坚持这样做.所以,我写了一个小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);
}
}
Run Code Online (Sandbox Code Playgroud)
这清楚地表明字符串在内存中存储为"My-Pizza".一天后,实习生回到我身边,告诉我教授现在声称C正在自动转换地址,以正确的顺序显示字符串.
我告诉他他的教授很疯狂,这显然是错的.但是为了检查我自己的理智,我决定在stackoverflow上发布这个,所以我可以让其他人确认我在说什么.
所以,我问:谁在这里?
我正在为实时离岸模拟器编写客户端和服务器,因为我必须通过套接字发送大量数据,所以我使用二进制数据来最大化我可以发送的大量数据.我已经知道了整数字节序,以及如何使用htonl和ntohl来规避字节序问题,但我的应用程序,就像几乎所有的模拟软件一样,处理大量的浮点数.
我的问题是:是否存在一些处理浮点数二进制格式的字节序问题?我知道我的代码运行的所有机器都使用浮点的IEEE实现,但在处理浮点数时是否存在一些字节序问题?
由于我只能访问具有相同endian的机器,所以我不能自己测试.所以,如果有人可以帮助我,我会很高兴的.
提前致谢.
我正在努力找到解决我的代码运行的机器是big-endian还是little-endian的最佳方法.我有一个有效的解决方案(虽然我没有在大端机器上测试它)但它看起来有点笨重:
import struct
little_endian = (struct.pack('@h', 1) == struct.pack('<h', 1))
Run Code Online (Sandbox Code Playgroud)
这只是将"本机"双字节包与little-endian包进行比较.有更漂亮的方式吗?
我做了一些谷歌搜索,在这个问题上找不到任何好文章.在实现我想要与endian无关的应用程序时,我应该注意什么?
endianness ×10
c++ ×4
c ×3
.net ×1
ascii ×1
bytearray ×1
c# ×1
c++14 ×1
intel ×1
networking ×1
optimization ×1
python ×1
x86 ×1