سؤال

أريد مضاعفة الأرقام الطويلة التي يتم تقديمها على أساس 2^32. لقد فكرت بالفعل في خوارزمية لطيفة للقيام بذلك ، لكنني للأسف أنا عالق. الموقف الذي تمسك به ، هو كيف أقوم بضرب اثنين من ints الطويلة وتمثيله على أساس 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. سيكون LowerHalf 0x1 والنصف العلوي 0xfffffffe. كيف أحصل على هذه القيم؟

(لقد وجدت هذا السؤال على ذلك ، لكنه ليس مفيدًا في وضعي لأن الإجابات التي أعطت AR مشابهًا لأفكاري: ضرب اثنين طويلة طويلة ints ج)

يحرر:نظامي هو Windows XP 32 بت. أنا أستخدم GCC 3.4.2 (MingW-special)

الإخراج الذي أحصل عليه أثناء تشغيل الكود:

4294967295
4294967295
1
4294967295

EDIT2:

  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" (هذا هو رأس المال الأول).

هذا يعتمد على السؤال كيف يمكنك طباعة int طويلة غير موقعة (محدد التنسيق لفترة طويلة غير موقعة طويلة)؟

نصائح أخرى

لست متأكدًا من سبب حصولك على هذه النتائج باستخدام برنامج التحويل البرمجي (غير المحدد) ولكن gcc تحت أوبونتو 10 يعطي:

4294967295
4294967295
18446744065119617025
18446744073709551615

مع هذين الاثنين الماضي 0xfffffffe00000001 و 264-1) على التوالي ، كما تريد.

لذلك ربما تفكر في التحول إلى مترجم أكثر حداثة. قد تكون تستخدم برنامج التحويل البرمجي قبل C99.

فقط بدافع الاهتمام ، ماذا يفعل sizeof (unsigned long) و sizeof (unsigned long long) يعطيك نظامك. هذا من شأنه أن يقطع شوطا طويلا نحو شرح مشكلتك.


بضعة أشياء أخرى للتحقق منها منذ sizeofيبدو أنه يشير إلى أن أنواع البيانات نفسها على ما يرام (على الرغم من أن هذه قد لا تحدد المشكلة - تم العثور عليها مع أ البحث الضحل إلى حد ما):

  • جرب استخدام "%I64u" كسلسلة التنسيق بدلاً من "%llu". إذا كانت Mingw تستخدم libs msvcrt ، فقد يكون ذلك مطلوبًا لـ 64 بت حقيقي printf الدعم.
  • تأكد من تجميعك -std=c99.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top