2014-02-11 5 views
5

Я только что вышел из интервью, где мне нужно было использовать это значение для алгоритма, который я придумал. После интервью мне было любопытно, есть ли способ получить максимальную стоимость Int.Max Int Значение для OCaml

Я знаю Int32.max_int и Int64.max_int.

Однако, когда я установил значение Int32.max_int для int, оно превысило максимальное значение, которое имеет Int.

# Int32.max_int;; 
- : int32 = 2147483647l 
# let a: int = 21474836471;; 
Characters 13-24: 
    let a: int = 21474836471;; 
       ^^^^^^^^^^^ 
Error: Integer literal exceeds the range of representable integers of type int 
+0

Понял, что в конце Int32.max_int был l. Чувствует себя плохим человеком. – BRS

ответ

9
$ ocaml 
     OCaml version 4.01.0 

# max_int;; 
- : int = 4611686018427387903 
# let a : int = max_int;; 
val a : int = 4611686018427387903 

Update

Для чего это стоит, если вы на 32-битной системе, Int32.max_int еще не укладывается в междунар, даже если вы исправить ошибка думать, что L (л) в конце является 1:

# Int32.max_int;; 
- : int32 = 2147483647l 
# let i : int = 21474836471 (* Mistake *);; 
Characters 14-25: 
    let i : int = 21474836471 (* Mistake *);; 
       ^^^^^^^^^^^ 
Error: Integer literal exceeds the range of representable integers of type int 
# let i : int = 2147483647 (* No mistake *);; 
Characters 14-24: 
    let i : int = 2147483647 (* No mistake *);; 
       ^^^^^^^^^^ 
Error: Integer literal exceeds the range of representable integers of type int 
# 

Так что я бы сказал, что L не было проблемой.

+0

Спасибо за быстрый ответ! И да, это то, что я искал :) – BRS

2

Помните, что OCaml использует бит высокого порядка целого для своих целей.

Таким образом, int всегда на один бит меньше, чем собственный int. Модули Int32 и Int64 предназначены для приложений, которым требуется соответствующая полная целая длина, особенно. интерфейсы к библиотекам и функциям C.

Toplevel тест:

# max_int;;  (* on 64 bit system *) 
- : int = 4611686018427387903 
# Int64.max_int;; (* the lower case l is uppercase on my system *) 
- : int64 = 9223372036854775807L 
# let n = 9223372036854775807L;; (* correct type inference *) 
val n : int64 = 9223372036854775807L 

Надеется, что это помогает понять его.

+0

(OCaml использует бит младшего разряда, а не бит высокого порядка.) –

+0

@JeffreyScofield, думая об этом, лучше не связываться с битом знака. –

+0

Реализация OCaml впечатляет своей экономией выбора. Использование младшего бита отлично работает для выделения непосредственных значений, поскольку указатели практически не указывают на нечетный адрес. Арифметика довольно проста; например, для добавления это всего лишь одна дополнительная инструкция для очистки младшего бита одного из операндов. –

Смежные вопросы