【问题标题】:The binary format for different data types不同数据类型的二进制格式
【发布时间】:2013-02-19 05:30:21
【问题描述】:

unsigned long long 类型的确切二进制格式是什么(至少在 Visual Studio 中)。

我正在使用别名指针进行一些按位操作,我通过对 unsigned char 指针的操作设置位,然后对 unsigned long long 指针(别名)进行一些其他操作。

unsigned long long 的格式看起来很奇怪,因此它弄乱了结果,而且位移操作似乎也表现得很奇怪:

从位掩码测试看来,这些数据是从right: LSB->MSB : left 排列的,这意味着>> 移位会将数据带到其更高的有效位而不是更少的位,这是正确的吗?

编译器为ICC 13.0,操作系统为windows 7-64。

【问题讨论】:

  • 也许对endianness的解释是有序的。
  • 您是否有可能通过指针欺骗(转换为char*)来提取单个字节?在这种情况下,您的困惑可能来自字节顺序问题。
  • 我使用 unsigned char * 设置位和别名指针来处理其他数学运算,它似乎把事情搞砸了。

标签: c++ c bit shift


【解决方案1】:

您描述的字节布局是小端,这是英特尔处理器通常使用的布局。位移不取决于数字的内存布局,而是取决于值,因此字节顺序不应影响操作的值。但是,如果您使用指针别名,例如强制转换为 char * 并使用指针算法来提取它的片段,您将获得与字节序相关的行为,在小字节序英特尔处理器上,这可能不是您所期望的。

【讨论】:

  • 如果您想提取单个字节而不关心字节顺序,您可以执行移位和掩码操作,例如 (x >> 16) & 0xff 以获得第三低位字节。
  • 这样做是否会对性能造成严重影响,谢谢。这里有几个别名指针的主要原因是为了提高性能,我可以改用 64 位宽的数据类型(如果需要)。
  • 我非常怀疑您会注意到差异,编译器可能无论如何都会对其进行优化。你真的注意到这种优化的必要性了吗?
  • @user0002128:“我可以改用 64 位宽数据类型”...如果您关心性能,请说明。如果从 64 位值中过滤掉特定位(使用& 和编译时间常数掩码)并测试 0/非零比做的更慢(它可能更快),我会感到惊讶8位片上的一些过滤器/测试。与|= 设置位相同。我认为你正处于过早优化的流沙之中。
  • @Tony D:当然,这是最后的手段,我坚持使用 unsigned char 的原因是为了更快的按位设置/访问,我现在只是更改我的代码以满足小端,所以现在可以了,至于为什么 64 位,嗯,对于位和,64 位宽的数据更快,因为此类任务有多个 SIMD 指令,而 SIMD 的按位逻辑运算有 256 位别名。
猜你喜欢
  • 2017-06-15
  • 1970-01-01
  • 2023-03-18
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2012-03-18
相关资源
最近更新 更多