Как определить -1 как uint64 в предложении соответствия? - PullRequest
2 голосов
/ 26 июля 2009
let myuint64 = 10uL
match myuint64 with
| -1   -> ()
| _    -> ()

Как определить значение -1 как значение uint64?

Ответы [ 7 ]

6 голосов
/ 26 июля 2009
> match 0UL-1UL with
-   |System.UInt64.MaxValue -> "-1"
-   |_ -> "???"
- ;;
val it : string = "-1"
5 голосов
/ 26 июля 2009

Позвольте мне оставить в покое тот факт, что вы не можете реально представить отрицательное значение с типом данных, который может хранить только положительные значения (и, конечно, ноль).

Если, с другой стороны, выхранил его в знаковом значении, -1 будет храниться как все установленные биты.

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

Тогда значение в синтаксисе C # и C / C ++ будет 0xffffffffffffffff. Как именно это указать в F #, я не знаю.

3 голосов
/ 26 июля 2009

Чтобы развернуть другие ответы: когда тип начинается с u , это означает без знака. Значения со знаком / без знака таковы:

Числа хранятся с использованием определенного количества битов. В случае int64 и uint64 используются 64 бита. Если номер подписан, 1-й бит не используется как часть самого номера, а только остальные 63. Этот бит используется, чтобы сказать, является ли число отрицательным. Если число не подписано, то все биты, включая 1-й бит, используются как часть числа, и число всегда неотрицательно (то есть: положительно или 0).

3 голосов
/ 26 июля 2009

Я совсем не знаю F #, но если это что-то похожее на другие языки, UInt64 не может быть -1. Когда-либо. UInt означает целое число без знака, что означает, что оно может представлять только положительные значения.

1 голос
/ 26 июля 2009

Ну, вы можете присвоить ему -1, и на большинстве архитектур храните там дополнение 2. Подписанный и неподписанный материал действительно только для проверки типов. На аппаратном уровне нет отрицательного знака.

Я понятия не имею, достаточно ли умна проверка типа f #, чтобы знать, что лексическая константа -1 является отрицательным числом и не должна помещаться в uint64.

С определенно не волнует.

 #include <stdio.h>
 #include <inttypes.h>
 main()
 {
 uint64_t x = -1;
 printf("0x%x\n", x); // 0xffffffff
 }
0 голосов
/ 26 июля 2009

если F # преобразует его для вас, то -1UL будет работать. Если нет, то вы можете указать его как 0xFFFFFFFFFFFFFFFFUL и добавить комментарий, чтобы помнить, что это -1.

В данный момент инструменты F # не установлены, поэтому я не могу это проверить.

0 голосов
/ 26 июля 2009

Если вы хотите пойти со знаком int:

-1: int64

, но вы не можете сопоставить отрицательное число с uint, как другие заявили.

...