c-32位结构如何表示负64位值



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

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

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

我读过关于";四边形有什么问题&";,但显然没有这样的东西。

位仅根据某些类型方案表示值。问题没有说明使用什么方案使lohi中的比特表示值。为了这个答案的目的,我们将假设:

  • LONG hi是一个32位2的补码整数
  • ULONG lo是一个32位无符号整数
  • 使用该LONGLONG结构的API将lohi解释为由hi的比特作为64比特数的高32比特并且low的比特作为低32比特形成的64比特2的补数

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

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

注意,由于x.lo是无符号的,因此赋值x.lo = n将把有符号的n转换为无符号的。此转换将通过包装模232来完成,并且x.lo的32位无符号值与n的32位二的补码值具有相同的位模式,因此实现了所需的结果。

最新更新