如何在匹配子句中将-1定义为uint64?

时间:2009-07-25 20:02:25

标签: f#

let myuint64 = 10uL
match myuint64 with
| -1   -> ()
| _    -> ()

如何将给定的-1定义为uint64值?

7 个答案:

答案 0 :(得分:6)

> match 0UL-1UL with
-   |System.UInt64.MaxValue -> "-1"
-   |_ -> "???"
- ;;
val it : string = "-1"

答案 1 :(得分:5)

让我一个人留下这样一个事实:你不能用一个只能存储正值的数据类型来表示负值(当然是零)。

另一方面,如果您将其存储在有符号值中,则-1将被存储为所有位设置。

所以基本上,我假设你想找到一种方法来表示-1作为一个与-1兼容的逐位值作为有符号值。

然后,在C#和C / C ++语法中,该值将为0xffffffffffffffff。究竟如何在F#中指定我不知道。

答案 2 :(得分:3)

我根本不知道F#,但如果它与任何其他语言一样,则UInt64 不能为-1。永远。 UInt表示无符号整数,这意味着它只能表示正值。

答案 3 :(得分:3)

扩展其他答案: 如果某个类型以 u 开头,则表示未签名。签名/未签名的含义是:

使用一定数量的位存储数字。在int64和uint64的情况下,使用64位。如果该号码已签名,则第1位不会用作号码本身的一部分,只有其他63位。该位用于表示该数字是否为负数。如果数字是无符号的,那么包括第1位的所有位都将用作数字的一部分,并且数字始终为非负数(即:为正数或0)。

答案 4 :(得分:1)

你可以将它指定为-1,并且在大多数架构上存储2的补码。签名和未签名的东西实际上只用于类型检查。硬件中没有负面信号。

我不知道f#类型检查器是否足够聪明,知道词法常量-1是负数,不应该放在uint64中。

C绝对不在乎。

 #include <stdio.h>
 #include <inttypes.h>
 main()
 {
 uint64_t x = -1;
 printf("0x%x\n", x); // 0xffffffff
 }

答案 5 :(得分:0)

如果你想使用signed int:

-1: int64

但是你不能将负数与uint相匹配,正如其他人所说的那样。

答案 6 :(得分:0)

如果F#会为你转换它,那么-1UL会起作用。如果没有,则可以将其指定为0xFFFFFFFFFFFFFFFFUL并添加注释以记住它为-1。

目前尚未安装F#工具,因此无法验证。