C 32位结构如何表示负64位值?

C 32位结构如何表示负64位值?,c,numbers,structure,C,Numbers,Structure,在没有任何内置本机64位支持的32位C编程环境中,但操作系统API的某些部分确实支持64位数字,我必须表示负值(范围-8192到-1)。大概我得自己做数学了 typedef struct _LONGLONG {ULONG lo;LONG hi} LONGLONG; LONGLONG x; 我如何将这样一个负值赋给x.lo和x.hi,以及(不太重要的)我如何验证它是正确的数字 我读过关于“quadpart有什么问题?”的文章,但显然没有这样的东西可用。位仅根据某种类型方案表示值。问题没有说明使用

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

typedef struct _LONGLONG {ULONG lo;LONG hi} LONGLONG;
LONGLONG x;
我如何将这样一个负值赋给x.lo和x.hi,以及(不太重要的)我如何验证它是正确的数字


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

位仅根据某种类型方案表示值。问题没有说明使用什么方案使
lo
hi
中的位表示值。为了回答这个问题,我们假设:

  • LONG hi
    是32位2的补码整数
  • ULONG lo
    是一个32位无符号整数
  • 使用此
    LONGLONG
    结构的API将
    lo
    hi
    解释为64位2的补码,其中
    hi
    的位为64位数字的高32位,而
    low
    的位为低32位
在这种情况下,如果
n
是[−8192, −1] ,64位2的补码表示法的上32位均为1,下32位与
n
的32位2的补码表示法的32位相同。因此,
LONGLONG x
的所需位模式可以通过以下方式设置:

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

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

x.hi是
长的
,因此它支持负数。另外,范围[-8192,-1]不需要64位。
32位C编程环境没有任何内置的本机64位
您能分享一下那是什么“环境”吗?你在用什么编译器<代码>操作系统API的某些部分哪些部分?什么零件?您使用的是什么API?您使用的是什么操作系统?你能说得更具体些吗?如果你的操作系统支持64位,如果用户应用程序不支持,那就很奇怪了<代码>我必须表示负值以什么方式表示?负数在您的“环境”中是如何表示的?(紧张地看着)FWIW:90年代和00年代的一个不真实的环境,不知道什么是int64,等等。顺便说一句,通用答案很有帮助。后来添加了一些64位功能,应用程序已经测试用户是否安装了这样的操作系统升级或更新版本。这没什么特别的,所以可能有点像32位版本的Windows,通过使用大整数来支持大文件?但是没有一些四部分nor _uInt64,或者现在人们提到的任何东西。我确实不需要64位的范围,但是API需要。我刚才提到的范围表示2个字节应该足够大,因此没有溢出位(请记住,我不知道答案有多简单)。谢谢!很好,很清楚。实数N是正的,但这很容易修正(N*=-1;或x.lo=0;x.lo-=N;)。现在,我还使用Rexx(“Rexx-rexxtry-say-X2B(D2X(-8192,32))”)验证了结果。