【问题标题】:big endian vs little endian大端与小端
【发布时间】:2012-04-08 12:12:05
【问题描述】:

我在 64 位英特尔处理器上工作...我正在学习大端和小端,我的理解是这些是一个字中的字节顺序,因此在 64 位数据中,msb 将在大端中具有最低地址endian 形式和 little endian 形式的最高地址...现在我有一个问题:

我写了this code
确定我的处理器是小端还是大端...
我输入

0102030405060708 (this is in hex) 

并希望得到080706和...和01作为答案

但是得到了02550-125-13501-4166
当我编写以 's' 为 2 字节(短)的相同代码时,0102 的输出为21(与小端一致)...那么这里出了什么问题?

【问题讨论】:

  • 当你写你的问题时,请注意它显示了它的外观预览。请使用它来确保您的问题看起来可读。谢谢你:)
  • 你认为代表 0x0102030405060708 的 double 的位码是什么?
  • 请参阅here,了解包含查找字节序的方法的问题。
  • char 是有符号类型。如果您不想要负数,请使用 unsigned char。
  • 我投票结束这个问题,因为代码不包括在内并且链接已过期

标签: c++ endianness


【解决方案1】:

您将输入值存储为double,它将值存储为floating point 值。尝试改用long long,它是一个 64 位整数,并且应该按照您的预期存储值。

【讨论】:

  • 如果我的字是 64 位的,并且有一个 9 字节长的数据类型,我将它设置为 0x010203040506070809...并按照相同的程序...我会看到 09 和 08 和 07。 ..和02? 01 会去哪里....下一个字的最低地址字节或最高地址字节?
  • @avinash 在 8byte 中存储 9byte 数据类型是不可能的,因此在存储它之前,它通常会引发编译时错误(或者你得到某种截断,这通常意味着你输了无法表示的高字节)
【解决方案2】:

将十六进制数字转换为(double) 不太可能达到您的预期;它是一个浮点值,由以 2 为底的尾数和指数组成。您可能会发现 (long)(long long) 更接近您的意图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2016-06-13
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多