Arhn - архитектура программирования

64-битный и 32-битный код C на Solaris 10

В моей системе Solaris 10 update 9 следующая команда дает:

#isainfo -b
64 

Но если я создам следующую программу на C с включенным limit.h, я получу:

#include <stdio.h>
#include <limits.h>

int main(void)
{ 
     printf("Maximum integer value on this system is = %d\n", INT_MAX);
}
gcc on64.c -o on64
./on64

Maximum integer value on this system is = 2147483647

Я ожидал гораздо большего результата, потому что система работает на 64-битной системе. Это похоже на 32-битный результат. Это проблема компилятора?

09.10.2010

Ответы:


1

Существует множество моделей программирования для 64-битных платформ, http://www.unix.org/version2/whatsnew/lp64_wp.html, в том числе:

  • ILP64 (где int, long и указатели являются 64-битными)
  • LP64 (где int — 32-битный, а long и указатели — 64-битный)

64-разрядная версия Solaris 10 использует модель LP64 (http://www.sun.com/software/solaris/faqs/64bit.xml#q4):

Вопрос. Какая модель данных используется в операционной системе Solaris?

A: LP64 является отраслевым стандартом де-факто. L представляет собой длинный, а P представляет указатель. Оба являются 64-разрядными, а int — 32-разрядными.

В дополнение к статье «64-битные модели программирования: почему LP64?» документ, упомянутый выше, возможно, вы захотите взглянуть на объяснение Рэймонда Чена, почему Win64 выбрала модель LLP64, так как это может помочь поддержать различные обоснования и аргументы в документе unix.org: http://blogs.msdn.com/b/oldnewthing/archive/2005/01/31/363790.aspx

09.10.2010
  • +1 за интересные ссылки. (Для протокола: хотя я понимаю, что Windows сделала с LLP64, я думаю, что LP64 является более разумной моделью. Жаль только, что кодовая база Win «galaxy» не дожила до этого перехода; накопилось слишком много плохих практик. ) 09.10.2010

  • 2

    Тип «int» является 32-битным в gcc независимо от платформы. «Длинный» тип — это 32 бита на 32-битных платформах и 64 бита на 64-битных платформах.

    Чтобы быть менее двусмысленным, вы можете использовать типы C99:

    #include <stdint.h>
    
    int32_t i32;
    int64_t i64;
    
    09.10.2010

    3

    Из документации gcc:

    В 64-битной среде int устанавливается на 32 бита и long, а указатель на 64 бита и генерирует код для архитектуры AMD x86-64.

    09.10.2010

    4

    Вы можете компилировать программы на Solaris 10 для 32-битной или 64-битной версии. По умолчанию они компилируются 32-битными.

    При использовании как GCC, так и более поздних компиляторов Sun опции '-m32' и '-m64' определяют, какая опция используется. Следовательно, попробуйте:

    $ gcc -m64 -o on64-64 on64.c
    $ gcc -m32 -o on64-32 on64.c
    

    Затем запустите:

    $ file on64 on64-32 on64-64
    ...take a look see...
    $ ./on64-64
    ...take a look see...
    $ ./on64-32
    ...as you originally found...
    $
    
    09.10.2010
  • int — это 32-битный тип как для 32-битной, так и для 64-битной архитектуры. Только долго было бы иначе. 19.05.2012

  • 5

    Если вам нужен размер самого большого целочисленного типа, это intmax_t:

    #include <stdio.h>
    #include <stdint.h>
    
    int main(void)
    { 
         printf("Maximum integer value on this system is = %jd\n", INTMAX_MAX);
    }
    

    Это всегда будет не менее 2^63 - 1.

    09.10.2010
  • Это фактически отобразит -1. Если вам нужно правильное отображение, используйте %lld вместо %d в формате инструкции printf. 11.10.2010

  • 6

    Во-первых, вы должны убедиться, что ваш компилятор работает в 64-битном режиме. Некоторые компиляторы по умолчанию используют режим 32-битной целевой платформы, даже если они способны генерировать 64-битный код.

    Во-вторых, некоторые компиляторы предпочитают 64-битную модель типов, где тип int остается 32-битным. GCC на самом деле является одним из них. Таким образом, ваши ожидания, что тип int станет 64-битным типом в 64-битном режиме, совершенно необоснованны.

    Опять же все зависит от компилятора и только от компилятора (и от настроек компилятора). То, что вы сделали со своей ОС, совершенно не имеет значения. Вы можете обновить Solaris до 237-битной или 1001-битной версии, но GCC будет продолжать генерировать 32-битный код, пока не будет изменено значение по умолчанию GCC или пока вы явно не запросите другую целевую платформу.

    10.10.2010

    7

    Если вы хотите увидеть «длинный» тип (32-битный в 32-битной архитектуре и 64-битный в 64-битной архитектуре, в отличие от «int», который всегда 32-битный), вы могли бы напечатать:

    printf("max long = %ld", LONG_MAX);
    

    это дает мне это при компиляции с '-m64'

    Max long on this system is: 9223372036854775807
    

    и это при компиляции с '-m32'

    Max long on this system is: 2147483647
    
    19.05.2012
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..