strtoull والحساب طويل
-
22-07-2019 - |
سؤال
ويمكن لأي شخص أن يفسر إخراج هذا البرنامج وكيف يمكنني إصلاحه؟
unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);
// 18446744073490980372
المحلول
هل قمت بتضمين <stdlib.h>
؟
وأنا يمكن أن تتكاثر على ماك X لو حذفت <stdlib.h>
.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
unsigned long long ns = strtoll("123110724001300", (char **)NULL, 10);
printf("%llu\n", ns);
return(0);
}
وحذفت رأس، وأحصل على النتيجة. تشمل الرأس، أحصل على الإجابة الصحيحة.
وكلا بتجميع 32 بت و 64 بت.
وكما لوحظ في التعليقات، في ظل عدم وجود إعلان عن strtoll ()، المترجم يعامل على أنه وظيفة عودته كثافة العمليات.
لرؤية المزيد من ما يجري، والنظر في مخرجات عرافة:
123110724001300 0x00006FF7_F2F8DE14 Correct
18446744073490980372 0xFFFFFFFF_F2F8DE14 Incorrect
وسفلية إدراجها يدويا ...
نصائح أخرى
لماذا لا تستخدم strtoull إذا كنت تريد غير الموقعة طويلة طويلة؟
وأنا لا يمكن أن يفسر السلوك. ومع ذلك، على 32 بت ويندوز XP مع سيغوين gcc-4.3.2
:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
unsigned long long ns = strtoull("123110724001300", NULL, 10);
fprintf(stderr, "%llu\n", ns);
return 0;
}
ويطبع
E:\Home> t.exe 123110724001300
لا تنتمي إلى StackOverflow