【问题标题】:How can a 32-bit structure represent a negative 64-bit value?32 位结构如何表示负 64 位值?
【发布时间】:2020-12-23 12:39:11
【问题描述】:

在没有任何内置原生 64 位支持的 32 位 C 编程环境中,但操作系统 API 的某些部分确实支持 64 位数字,我必须表示一个负值(范围 -8192 到包括-1)。大概我必须自己做数学。

typedef struct _LONGLONG {ULONG lo;LONG hi} LONGLONG;
LONGLONG x;

如何将这样一个负值分配给 x.lo 和 x.hi,以及(不太重要)也许我如何验证它是正确的数字?

我读过“Quadpart 有什么问题?”,但显然没有这样的东西可用。

【问题讨论】:

  • x.hi 是LONG,所以它支持负数。此外,范围 [-8192, -1] 不需要 64 位。
  • 32-bit C programming environment without any built-in native 64-bit 你能分享一下那是什么“环境”吗?你用的是什么编译器? some parts of the operating system API's哪些部分?什么部位?您使用的是什么 API?您使用什么操作系统?你可以再详细一点吗?如果您的操作系统支持 64 位,那么如果 userapps 不支持,那就太奇怪了。 I have to represent a negative value“代表”以什么方式? “如何”在您的“环境”中表示负数? (紧张地看着twos complement
  • FWIW:90 年代和 00 年代的不寻常环境,不知道 __int64 等等。顺便说一句,通用答案有所帮助。后来添加了一些 64 位功能,该应用程序已经测试用户是否安装了此类操作系统升级或更新版本。这没什么特别的,所以可能有点像 32 位版本的 Windows 通过使用 LARGE_INTEGER 来支持大文件?但是没有一些 Quadpart 或 __int64,或者现在人们所指的任何东西。
  • 我确实不需要 64 位的范围,但 API 需要。我刚刚提到了表示 2 个字节应该足够的范围,因此不涉及溢出位(同时请记住,我不知道答案有多容易)。

标签: c numbers structure


【解决方案1】:

位仅根据某种类型方案表示值。该问题没有说明使用什么方案使lohi 中的位表示值。出于此答案的目的,我们将假设:

  • LONG hi 是一个 32 位二进制补码整数。
  • ULONG lo 是一个 32 位无符号整数。
  • 使用此 LONGLONG 结构的 API 将 lohi 解释为 64 位二进制补码数,由 hi 的位作为 64 位数的高 32 位和low 为低 32 位。

在这种情况下,如果n是[−8192, −1]中的值,则64位二进制补码表示的高32位全为1,低32位与32位相同n 的 32 位二进制补码表示的位。因此,LONGLONG x 所需的位模式可以设置为:

x.hi = -1;
x.lo = n;

注意,由于x.lo 是无符号的,赋值x.lo = n 会将有符号的n 转换为无符号的。此转换将通过模 232 包装来完成,x.lo 的 32 位无符号值与n 的 32 位二进制补码值具有相同的位模式,因此达到了预期的效果。

【讨论】:

  • 谢谢!优秀,清晰。真正的 N 是正数,但很容易解决(n*=-1; 或 x.lo=0;x.lo-=n;)。现在我还使用 Rexx ("rexx rexxtry say X2B(D2X(-8192,32))") 验证了结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多