سؤال

ويمكن لأي شخص أن يفسر إخراج هذا البرنامج وكيف يمكنني إصلاحه؟

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top