[英]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.