簡體   English   中英

如何正確地將兩個long long int相乘?

[英]How to correctly multiply two long long ints?

我想乘以2 ^ 32為基礎的長數字。 我已經想到了一種不錯的算法可以做到這一點,但不幸的是,我陷入了困境。 我遇到的情況是如何將兩個長整數相乘並以2 ^ 32為基礎表示它。

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
typedef unsigned int uint32;
typedef unsigned long long uint64;
int main(int argc, char* argv[] )
{

  uint64 a = (uint64)ULONG_MAX;
  printf("%llu\n", a);
  uint64 b = (uint64)ULONG_MAX;  
  printf("%llu\n", b);  
  uint64 c = (uint64)(a*b);

  printf("%llu\n", c);  // prints 1. that would be to lower 32 bits of the results. the upper half is 0xFFFFFFFE

  printf("%llu\n", ULLONG_MAX);
  system("pause");
}

為什么ULLONG_MAX與ULONG_MAX相同? 根據http://en.wikipedia.org/wiki/Limits.h#Member_constants ,應為18,446,744,073,709,551,615 I

從我的評論中可以看到,我想要兩個uint32中的乘法結果。 下半部分為0x1,上半部分為0xFFFFFFFE。 如何獲得這些價值?

(我在SO上發現了這個問題,但對我的情況沒有幫助,因為給出的答案與我的想法類似: 將兩個long long int C相乘

編輯:我的系統是Windows XP 32位。 我正在使用gcc 3.4.2(mingw-special)

我在運行代碼時得到的輸出:

4294967295
4294967295
1
4294967295

編輯2:

  printf("%i\n", sizeof(unsigned long));
  printf("%i\n", sizeof(unsigned long long)); 

退貨

4
8

編輯3:感謝Petesh,我能夠找到解決方案:

  printf("%lu\n", c & 0xFFFFFFFF);
  printf("%lu\n", (c >> 32));

提示在系統中(“暫停”)-您在Windows上嗎? 使用Microsoft Visual C運行時長時間打印需要使用'%I64u'(大寫i)。

這是基於這樣的問題: 如何打印無符號長整型int(無符號長整型int的格式說明符)?

不確定為什么要使用(未指定的)編譯器獲得這些結果,但是在Ubuntu 10下使用gcc得到:

4294967295
4294967295
18446744065119617025
18446744073709551615

根據需要,最后兩個分別為0xfffffffe00000001和(2 64 -1)。

因此,也許考慮切換到最新的編譯器。 可能是您使用的是C99之前的編譯器。

出於興趣, sizeof (unsigned long)sizeof (unsigned long long)在您的系統上給您帶來了什么。 這將對解釋您的問題大有幫助。


由於您的sizeof似乎表明數據類型本身還可以,因此還需要檢查其他幾件事(盡管這些可能無法解決問題-它們是通過相當淺的網絡搜索找到的 ):

  • 嘗試使用"%I64u"作為格式字符串,而不是"%llu" 如果MinGW使用MSVCRT庫,則可能需要真正的64位printf支持。
  • 確保使用-std=c99編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM