大端和小端有点混乱

2024-02-28

我正在从这个网站上阅读有关小端和大端表示的内容http://www.geeksforgeeks.org/little-and-big-endian-mystery/ http://www.geeksforgeeks.org/little-and-big-endian-mystery/.

假设我们有一个数字 0x01234567,那么在 Little Endian 中,它存储为 (67)(45)(23)(01),在 Big Endian 中,它存储为 (01)(23)(45)(67)。

char *s= "ABCDEF"
int *p = (int *)s;
printf("%d",*(p+1)); // prints 17475 (value of DC)

看到上面代码中的打印值后,字符串似乎存储为 (BA)(DC)(FE)。

为什么它不像第一个示例中那样从 LSB 到 MSB 像 (EF)(CD)(AB) 那样存储?我认为字节顺序意味着多字节内的字节顺序。因此,排序应该是关于“整个 2 个字节”,如第二种情况,而不是在这 2 个字节内,对吧?


使用 2 字节ints,这就是你的记忆

memAddr  |  0  |  1  |  2  |  3  |  4  |  5  |  6   |
data     | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | '\0' |
            ^ s points here
                        ^ p+1 points here

现在,看起来您正在使用 ASCII 编码,所以这就是您的really记忆中有

memAddr  |  0   |  1   |  2   |  3   |  4   |  5   |  6   |
data     | 0x41 | 0x42 | 0x43 | 0x44 | 0x45 | 0x46 | 0x00 |
            ^ s points here
                          ^ p+1 points here

所以对于小端机器来说,这意味着最低有效字节对于多字节类型先来吧。单字节没有字节顺序的概念char。 ASCII 字符串只是一个字符串char是..这没有字节顺序。你的ints 是 2 个字节。所以对于一个int从内存位置 2 开始,该字节是最低有效字节,地址 3 处的字节是最高有效字节。这意味着这里的数字,以人们通常读取数字的方式读取,是 0x4443(基数为 10 的 17475,“DC”作为 ASCII 字符串),因为内存位置 3 中的 0x44 比内存位置 2 中的 0x43 更重要。对于大端序当然,这会颠倒过来,数字将是 0x4344(基数为 10 的 17220,“CD”作为 ASCII 字符串)。

EDIT:

处理您的评论... Ac字符串是一个NUL终止数组chars,这是绝对正确的。 Endianess 仅适用于原始类型,short, int, long, long long等等(“原始类型”可能是不正确的命名法,知道的人可以纠正我)。数组只是连续内存的一部分,其中 1 个或多个类型直接相邻出现并存储依次地。整个数组没有字节序的概念,但是,字节序does适用于数组各个元素的基本类型。假设您有以下内容,假设 2 字节ints:

int array[3];  // with 2 byte ints, this occupies 6 contiguous bytes in memory
array[0] = 0x1234;
array[1] = 0x5678;
array[2] = 0x9abc;

这就是内存的样子:无论对于大端还是小端机器,它都会看起来像这样

memAddr   |    0-1   |    2-3   |    4-5   |
data      | array[0] | array[1] | array[2] |

请注意,数组没有字节顺序的概念elements。无论元素是什么,这都是事实。元素可以是原始类型,structs,, 任何事物。数组中的第一个元素始终位于array[0].

但现在,如果我们查看数组中的实际内容,就会发现字节序确实发挥作用。对于小端机器,内存将如下所示:

memAddr   |  0   |  1   |  2   |  3   |  4   |  5   |
data      | 0x34 | 0x12 | 0x78 | 0x56 | 0xbc | 0x9a |
             ^______^      ^______^      ^______^
             array[0]      array[1]      array[2]

最低有效字节在前。大端机器看起来像这样:

memAddr   |  0   |  1   |  2   |  3   |  4   |  5   |
data      | 0x12 | 0x34 | 0x56 | 0x78 | 0x9a | 0xbc |
             ^______^      ^______^      ^______^
             array[0]      array[1]      array[2]

注意contents数组的每个元素都受字节顺序的影响(因为它是一个基本类型的数组..如果它是一个数组structs, the struct成员不会受到某种字节序反转的影响,字节序仅适用于原语)。然而,无论是在大端机还是小端机上,数组元素的顺序仍然相同。

回到你的字符串,字符串只是一个NUL终止的字符数组。chars 是单字节,因此只有一种方法可以对它们进行排序。考虑代码:

char word[] = "hey";

这就是你记忆中的内容:

memAddr   |    0    |    1    |    2    |    3    |
data      | word[0] | word[1] | word[2] | word[3] |
                  equals NUL terminator '\0' ^

就在这种情况下,每个元素word数组是一个字节,并且只有一种方法来订购单个项目,因此无论是在小端还是大端机器上,这就是您在内存中的内容:

memAddr   |  0   |  1   |  2   |  3   |
data      | 0x68 | 0x65 | 0x79 | 0x00 |

Endianess 仅适用于多字节原始类型。我强烈建议您在调试器中进行探索,以实际操作来查看这一点。所有流行的 IDE 都有内存视图窗口,或者带有gdb你可以打印出内存 http://www.delorie.com/gnu/docs/gdb/gdb_56.html. In gdb您可以将内存打印为字节、半字(2 个字节)、单词(4 个字节)、巨型单词(8 个字节)等。在小端机器上,如果您将字符串打印为字节,您将看到其中的字母命令。作为半字打印,您会看到每 2 个字母“反转”,作为单词打印,每 4 个字母“反转”,等等。在大端机器上,它都会以相同的“可读”顺序打印出来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大端和小端有点混乱 的相关文章

  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • 与 for_each 或 std::transform 一起使用时,如何调用 C++ 函子构造函数

    我以前从未使用过 C 函子 所以我只是想了解它们是如何工作的 例如假设我们有这个函子类 class MultiplyBy private int factor public MultiplyBy int x factor x int ope
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu

随机推荐

  • Ruby on Rails 开关 [重复]

    这个问题在这里已经有答案了 有人可以提供一个关于如何在 Ruby 中使用 switch case 来表示变量的示例吗 我假设你指的是案例 时间 case a variable a variable is the variable we wa
  • C++ 构造函数初始值设定项列表抛出异常

    我对以下代码有问题 可以看到我已经在C的构造函数中处理了A的构造函数抛出的异常 为什么还要在main函数中再次捕获并处理异常呢 include
  • 如何使用tcl中的puts更改文本颜色

    我想通过使用 tcl 中的 put 命令来更改控制台中显示的文本颜色以简化调试 我看到很多文章是 abt tk 而不是 tcl 仅供参考 我在 Windows 7 上使用 Active tcl 我尝试过其他人提供的以下代码 http www
  • MySQL 5.1 中需要一个抽象触发器来更新审核日志

    我需要一种方法来检查表中已更改的任何条目并将其传递到审核日志中 它需要从表结构中抽象出来 例如 CREATE TRIGGER table1 update BEFORE UPDATE ON table1 FOR EACH ROW BEGIN
  • 我如何摆脱这个 unicode 字符?

    Any idea how to get rid of this irritating character U 0092 from a bunch of text files I ve tried all the below but it d
  • 如何迭代对象数组以进行预输入?

    http angular ui github io bootstrap http angular ui github io bootstrap 我想使用引导程序的预输入 并在对象中搜索两个不同的密钥对 如何迭代数组对象 另外有人可以解释一下
  • Git 可以忽略内容相同但时间戳更新的文件吗

    我在最近的网络项目中使用 FTP 我尝试使用 git 在 FTP 上保留所有更改的本地备份 FTP 服务器似乎无法支持 MFMT 命令 或者我犯了一些其他错误 下载的文件不保留其时间戳 当我对新下载的文件进行 git diff 时 Git
  • sudo pecl 在 os x lion 上安装 apc 错误

    我尝试在 OS X Lion 上使用 pecl 安装 APC sudo pecl install apc 并且它抱怨缺少 pcre h 文件 In file included from private tmp pear temp APC a
  • JavaScript typeof 曾经返回过“数组”吗?

    我在各种开源项目中都看到过这种习惯用法 it instanceof Array typeof it array 我知道后半部分在 ECMAScript 5 或 6 中不可能是真的 但是是否有一个实现可以从 typeof 返回 数组 或者这是
  • $this->getRequest()->isPost() 返回 false

    我正在处理一个现有代码 最后一个开发人员创建了一个表单 但没有使用 form 代码是 public function indexAction objRequest this gt getRequest var dump objRequest
  • 使用 split_part 后替换空字段中的值

    我有两列 id integer and version text 我正在尝试将字符串转换为version转换为整数 以便我可以选择 id 的最大 最新 版本 然而 第一个实例id将自身存储为version 例子 id version 10
  • 在 C++ WIN32 中识别后台进程并将其带到前台

    谁能告诉我如何识别特定的后台进程 即已经运行的应用程序 并将其带到前台 例如 如果记事本应用程序在后台运行 当我运行 WIN32 应用程序时 它应该识别记事本应用程序 并且记事本应该弹出或进入前台 我尝试了 SwitchToThisWind
  • 如何更改 unsigned char 中的 4 位?

    unsigned char adata unsigned char malloc 500 sizeof unsigned char unsigned char single char adata 100 如何更改 single char 中
  • 如何追查 Wildfly 8.2.0.Final 中不起眼的 HA 集群错误

    设置 我有一个 Wildfly 8 2 0 Final 应用程序服务器 使用 full ha 配置文件在域模式下运行集群 该集群由两个 Wildfly 实例组成 主实例和从实例 每个实例都运行在自己的虚拟机上 应用程序 我的项目作为 war
  • Perl 中字符串的长度与字符编码无关

    长度函数假设汉字超过一个字符 如何在 Perl 中独立于字符编码确定字符串的长度 将中文字符视为一个字符 The length http perldoc perl org functions length html函数对字符进行操作 而不是
  • PHP 正则表达式句点

    如何在 PHP 正则表达式中添加句点 代码中的使用方式是 echo preg match d 1 645 matches 但显然那个时期 645 不被认可 请求有关如何开展这项工作的提示 Since 是一个特殊字符 你需要转义它才能真正得到
  • 在 Swift 子类中添加便捷初始化器

    作为学习练习 我正在尝试实现一个子类SKShapeNode它提供了一个新的方便的初始值设定项 它接受一个数字并构造一个 ShapeNode 它是数字宽度和高度的正方形 根据斯威夫特书 https developer apple com li
  • Python 2.7:附加到字典键的列表值

    我有以下数据 data 1 2 1 3 1 4 2 1 2 2 2 3 我想创建一个包含键列表值的字典 如何通过字典理解来做到这一点 i e 1 2 3 4 2 1 2 3 我已尝试以下操作 但列表在每次迭代时都会被覆盖 x y for x
  • bash中如何通过另一个变量获取一个变量?

    我在 bash 中有三个数组 arr1 arr2 arr3 arr2 1 2 3 4 arr3 6 7 8 9 How can I get a element of arr2 by arr1 like below arr1 0 0 To g
  • 大端和小端有点混乱

    我正在从这个网站上阅读有关小端和大端表示的内容http www geeksforgeeks org little and big endian mystery http www geeksforgeeks org little and bi