Как заставить 64-битную целочисленную арифметику на OS X? - PullRequest
1 голос
/ 29 апреля 2009

Я пытаюсь форсировать 64-битные целые числа в OS X 10.5.6. работает на Apple MacBook Intel Core 2 Duo. Вот мой код c:

#include<stdio.h>

int main()
{
    long a = 2147483647; /*== 2^32 - 1*/
    long aplus1;

    printf("a== %d. sizeof(a) == %d  \n", a, sizeof(a));

    aplus1 = a+1;

    printf("aplus1 = %d \n", aplus1);
}

Компиляция без каких-либо ключей дает следующее:

$ gcc testlong.c -o testlong ;./testlong

a== 2147483647. sizeof(a) == 4  
aplus1 = -2147483648 

Компиляция с ключом -m64 дает:

$ gcc testlong.c -o testlong -m64; ./testlong

a== 2147483647. sizeof(a) == 8  
aplus1 = -2147483648 

Таким образом, вторая версия, очевидно, использует 64-битное хранилище, но все равно генерирует ошибку переполнения, хотя 2 ^ 32 должно быть в пределах диапазона 64-битного целого числа. Есть идеи?

Я бы предпочел решение, которое можно принудительно выбрать из опции gcc, вместо того, чтобы требовать, чтобы я изменил несколько строк исходного кода (моя настоящая проблема не в приведенном выше примере, а скорее, мне нужно принудительно использовать целочисленную арифметику в более общем виде. ситуация).

Ответы [ 5 ]

9 голосов
/ 29 апреля 2009

Мало того, что вы должны использовать long long, вы также должны соответствующим образом изменить операторы printf ().

#include<stdio.h>

int main()
{
    long long a = 2147483647; /*== 2^32 - 1*/
    long long aplus1;

    printf("a== %lld. sizeof(a) == %d  \n", a, sizeof(a));

    aplus1 = a+1;

    printf("aplus1 = %lld \n", aplus1);
}

% lld - код для длинных длинных.

Очевидно, что 64-битные программы могут использовать% d для 64-битных целых чисел - я не знаю, возможно ли настроить его для компиляции в этом режиме.

3 голосов
/ 29 апреля 2009

Если вы используете C99, включите stdint.h и используйте uint64_t и int64_t. Кроме этого, unsigned long long a = 0x100000000ull; должно работать тоже.

2 голосов
/ 29 апреля 2009

Используйте стандарт C99:

#include <stdint.h>

uint64_t a = 2147483647ULL;

Отличный обзор библиотеки C99 на Dinkumware .

0 голосов
/ 29 апреля 2009

Литерал 2147483647 в коде C имеет тип int. Если вы хотите, чтобы это было long, то не помешает иметь long слева, это все равно int справа.

Сделайте его длинным литералом, добавив букву 'L': 2147483647L (рекомендуется заглавная буква, строчная буква "l" тоже работает, но в зависимости от шрифта может быть очень запутанной).

0 голосов
/ 29 апреля 2009

Вы пробовали:

long long a = 2147483647;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...