MAKEWORD 是做啥用的?

     2023-02-22     200

关键词:

【中文标题】MAKEWORD 是做啥用的?【英文标题】:What is MAKEWORD used for?MAKEWORD 是做什么用的? 【发布时间】:2014-06-10 02:14:20 【问题描述】:

我在一段教学代码中遇到了这个宏MAKEWORD(2,2)。我在 MSDN 中读到它“通过连接指定的值来创建一个 WORD 值。

问题是,WORD 不是类似于无符号整数的东西,为什么我需要执行诸如使用MAKEWORD() 之类的奇怪过程?

【问题讨论】:

【参考方案1】:

宏需要两个字节作为其参数:

WORD MAKEWORD(
  BYTE bLow,
  BYTE bHigh
);

它在Windef.h 中定义为:

#define MAKEWORD(a,b)   ((WORD)(((BYTE)(a))|(((WORD)((BYTE)(b)))<<8)))

它基本上是从两个 1 字节的字构建一个 16 位的字(而且看起来不太便携)

1 字节(一个 WORD)的数字 2 的二进制表示是: | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |

如果我们像 MAKEWORD(2,2) 那样将这些字节中的两个连接起来,我们会得到:

| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |

512 + 2 = 514:live demo.

这个特定宏的唯一真实示例是在Initialization of Winsock 中,用于生成WSAStartup 期望的版本控制字。

【讨论】:

谢谢,但我还是不明白为什么要这样做。你能做吗WORD = 2.2;我是初学者所以这种事情对我来说很奇怪。 @user3704920 ,请参阅我的编辑以获取二进制解释。 2.2跟这个没关系,MAKEWORD不是串联字符串,而是位。 任何预期的可移植性可能来自在系统提供的头文件中可以根据需要在字节序不同的系统或交叉编译器上以不同方式定义宏,不是来自您拥有的任何给定版本的头文件中的任何一个特定定义。【参考方案2】:

粗略地说,MAKEWORD(x,y) 等价于((y) &lt;&lt; 8 | (x));这在将两个字节大小的值打包到单个 16 位字段中时很有用,这在通用消息结构中经常发生。互补操作由LOBYTEHIBYTE 宏执行,它们从WORD 操作数中提取低位或高位字节。

宏在 16 位 Windows 时代得到了广泛使用,但一旦 32 位程序占据主导地位,它的重要性就下降了。 16 位 Windows 的另一个痕迹在于 MSG 结构成员 wParamlParam 的名称,它们最初的类型分别为 WORDLONG;他们现在都是LONG

Charles Petzold 的著作Programming Windows, second edition 提供了巨大的历史洞察力。

【讨论】:

in this ((y) @RaHuL 因为在大多数系统(可能是 Windows 可以运行的所有系统)上,一个字节是一个八位字节(八位)。因此,如果您从两个 8 位半部构造一个 16 位值,您希望将其中一个移动 8 位以正确排列位。【参考方案3】:

许多小型数字设备(例如数字温度计)会将其数据存储在 8 位寄存器中。一个 8 位寄存器可以存储 -127 到 127 之间的有符号数。因此,要存储低于 -127 或高于 127 的数字,需要使用两个 8 位寄存器:低 8 位存储在寄存器 1 中,高 8 位存储在寄存器 2 中.读取数据的计算机需要从两个寄存器中获取数据,然后重新组合这两个值以生成介于 -32767 和 32767 之间的 16 位数字。MAKEWORD 宏是组合两个小的 8 位数字的快速方法成一个更大的 16 位数字。如果数据更高,它将存储在更多的 8 位寄存器中。 希望这是有道理的。

【讨论】:

sigaddset 是做啥用的?

】sigaddset是做啥用的?【英文标题】:Whatissigaddsetusedfor?sigaddset是做什么用的?【发布时间】:2014-12-0111:37:41【问题描述】:我有这段代码,我使用sigaddset和sigaction。但是,如果我评论segaddset结果是一样的structsigactionact;act.sa_handl... 查看详情

maven.multiModuleProjectDirectory 是做啥用的?

】maven.multiModuleProjectDirectory是做啥用的?【英文标题】:Whatismaven.multiModuleProjectDirectoryusedfor?maven.multiModuleProjectDirectory是做什么用的?【发布时间】:2015-06-2823:19:04【问题描述】:我在SO和Maven邮件列表上看到了很多关于设置env参... 查看详情

cursor.setNotificationUri() 是做啥用的?

】cursor.setNotificationUri()是做啥用的?【英文标题】:Whatiscursor.setNotificationUri()usedfor?cursor.setNotificationUri()是做什么用的?【发布时间】:2014-03-0415:02:29【问题描述】:我研究了如何使用ContentProviders和来自thistutorial的加载器我是怎... 查看详情

itertools.groupby() 是做啥用的?

】itertools.groupby()是做啥用的?【英文标题】:Whatisitertools.groupby()usedfor?itertools.groupby()是做什么用的?【发布时间】:2017-05-1515:43:37【问题描述】:在阅读python文档时,我遇到了itertools.groupby()功能。这不是很简单,所以我决定在... 查看详情

渠道是做啥用的?

】渠道是做啥用的?【英文标题】:Whatarechannelsusedfor?渠道是做什么用的?【发布时间】:2017-02-1102:35:37【问题描述】:在查看一些Go代码时,我发现了以下内容:ch:=make(chanint)我查阅了一个在线教程,了解GoChannels的工作原理:ht... 查看详情

Laravel 中的 `HtmlString` 是做啥用的?

】Laravel中的`HtmlString`是做啥用的?【英文标题】:Whatis`HtmlString`usedforinLaravel?Laravel中的`HtmlString`是做什么用的?【发布时间】:2017-07-0806:01:45【问题描述】:本课程:HtmlStringhtml=$html;/***获取HTML字符串。**@return字符串*/公共函数t... 查看详情

EasyMock.replay() 是做啥用的?

】EasyMock.replay()是做啥用的?【英文标题】:WhatisEasyMock.replay()usedfor?EasyMock.replay()是做什么用的?【发布时间】:2011-08-2415:14:28【问题描述】:我是单元测试和Junit的新手。我知道Junit的基础知识。我刚开始学习EasyMock框架。我无... 查看详情

SetPixelFormat() 中的 PIXELFORMATDESCRIPTOR 参数是做啥用的?

】SetPixelFormat()中的PIXELFORMATDESCRIPTOR参数是做啥用的?【英文标题】:WhatisthePIXELFORMATDESCRIPTORparameterinSetPixelFormat()usedfor?SetPixelFormat()中的PIXELFORMATDESCRIPTOR参数是做什么用的?【发布时间】:2010-03-2918:51:16【问题描述】:通常在设... 查看详情

Iterable 接口是做啥用的?

】Iterable接口是做啥用的?【英文标题】:WhatistheIterableinterfaceusedfor?Iterable接口是做什么用的?【发布时间】:2010-11-0617:52:36【问题描述】:我是初学者,无法理解Iterable界面的真实效果。【问题讨论】:【参考方案1】:除了Jere... 查看详情

predicateWithBlock: 中块的 bindings 参数是做啥用的?

】predicateWithBlock:中块的bindings参数是做啥用的?【英文标题】:WhatisthebindingsparameterfortheblockinpredicateWithBlock:usedfor?predicateWithBlock:中块的bindings参数是做什么用的?【发布时间】:2011-09-1914:10:01【问题描述】:+[NSPredicatepredicateWithB... 查看详情

app.config 是做啥用的?

】app.config是做啥用的?【英文标题】:Whatisapp.configfor?app.config是做什么用的?【发布时间】:2010-11-2817:44:52【问题描述】:Settings.settings生成Settings.Designer.cs,它可能会生成app.config,然后将其作为Foo.exe.config复制到输出目录。当... 查看详情

UITextInput 的 Tokenizer,它是做啥用的?

】UITextInput的Tokenizer,它是做啥用的?【英文标题】:TokenizerofUITextInput,whatisitusedfor?UITextInput的Tokenizer,它是做什么用的?【发布时间】:2013-05-0210:17:12【问题描述】:我正在实现一个自定义文本输入视图,它采用UITextInput协议,... 查看详情

namedtuple 的第一个参数是做啥用的?

】namedtuple的第一个参数是做啥用的?【英文标题】:What\'sthefirstargumentofnamedtupleusedfor?namedtuple的第一个参数是做什么用的?【发布时间】:2015-08-1202:46:34【问题描述】:我们像这样使用namedtuple:>>>fromcollectionsimportnamedtuple&... 查看详情

eq是做啥用的,它和压缩一样吗.如果不一样那压缩是做啥用的~

EQ是频率均衡器,它能够允许用户主动地对声音的各频段进行增益或衰减的处理。压缩是是对电信号的处理装置,它会将过大的电压减弱,过小的电压增强,体现在声音上就是能够让音箱中放出的声音稳定在一个设定的范围,尤... 查看详情

用户定义的操作“类型”是做啥用的?

】用户定义的操作“类型”是做啥用的?【英文标题】:Whatistheuserdefinedaction"type"for?用户定义的操作“类型”是做什么用的?【发布时间】:2016-08-0801:43:29【问题描述】:这里的“类型”列有什么作用?【问题讨论】:... 查看详情

测试和设置是做啥用的?

】测试和设置是做啥用的?【英文标题】:WhatisTest-and-Setusedfor?测试和设置是做什么用的?【发布时间】:2008-09-2313:22:00【问题描述】:在阅读了Test-and-SetWikipediaentry之后,我仍然想知道“Test-and-Set的用途是什么?”我知道您可... 查看详情

cacert.pem 到底是做啥用的?

】cacert.pem到底是做啥用的?【英文标题】:Whatexactlyiscacert.pemfor?cacert.pem到底是做什么用的?【发布时间】:2013-02-0522:14:39【问题描述】:在我的PayPalPro支付页面中,我使用cURL函数curl_setopt_array()和以下选项:cUInCURLOPT_CAINFO=&gt... 查看详情

pyproject.toml 文件是做啥用的?

】pyproject.toml文件是做啥用的?【英文标题】:Whatispyproject.tomlfilefor?pyproject.toml文件是做什么用的?【发布时间】:2020-11-0900:26:03【问题描述】:背景我正准备尝试从GitHub下载的Python包,发现它没有setup.py,所以我无法安装它pipin... 查看详情