uint64_t выдаёт результат как int32_t

Рейтинг: 0Ответов: 1Опубликовано: 10.02.2023

Пробегаюсь по циклу и никак не могу понять как это получается?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <stdint.h>

#define DEBUG 1

#define NUMSYMBOLS 24
#define BUFLEN (NUMSYMBOLS * 8)

int loop(uint64_t numb)
{
    debugprint("numb", numb, 0);
    uint64_t res = 0;
    for (uint64_t i = 0; i < numb; i++)
    {
        res += i;
        // debugprint("res", res, i % 1000000);
    }

    unsigned long long big = 1844674407370955161;

    debugprint("big", big, 0);
    debugprint("ULLONG_MAX", ULLONG_MAX, 0);
    debugprint("res", res, 0);
    return res;
};

void debugprint(char *name, unsigned long long res, int go)
{
    if (DEBUG == 0 || go != 0)
        return;
    char buf[BUFLEN];
    memset(buf, 0, BUFLEN);
    sprintf(buf, "%d", res);
    printf("\n%s\nbits:\t%d\n", name, sizeof(res) * 8);
    printf("val:\t%s\n", buf);
};

void main()
{
    loop(5000000);
};

Вывод программы:

numb
bits:   64
val:    5000000

big
bits:   64
val:    -1717986919

ULLONG_MAX
bits:   64
val:    -1

res
bits:   64
val:    1642668640

Почему значения не unsigned long long???

PS D:\GitHub\loop_speed> gcc -dumpmachine
x86_64-w64-mingw32

Ответы

▲ 0

Да, я не подумал что функция обязана вернуть инт...

int loop(uint64_t numb)
{
    return (uint64_t)999999999999999;
}

Ну, сам себе буратино, спасибо за ответы!