F# 如何在匹配子句中将-1定义为uint64? 设myuint64=10uL 将myuint64与 | -1 -> () | _ -> ()

F# 如何在匹配子句中将-1定义为uint64? 设myuint64=10uL 将myuint64与 | -1 -> () | _ -> (),f#,F#,如何将给定的-1定义为uint64值?让我先不提一个事实,即不能用只能存储正值(当然还有零)的数据类型来表示负值 另一方面,如果将其存储在有符号值中,-1将作为所有位集存储 所以基本上,我会假设您想找到一种方法,将-1表示为一个位值,它将与-1兼容为一个有符号值 然后,在C#和C/C++语法中,该值将是0xFFFFFFFFFFFF。确切地说,如何在F#中指定它,我不知道。我根本不知道F#,但如果它与任何其他语言一样,UInt64不能是-1。曾经UInt表示无符号整数,这意味着它只能表示正值。如果

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

让我先不提一个事实,即不能用只能存储正值(当然还有零)的数据类型来表示负值

另一方面,如果将其存储在有符号值中,-1将作为所有位集存储

所以基本上,我会假设您想找到一种方法,将-1表示为一个位值,它将与-1兼容为一个有符号值


然后,在C#和C/C++语法中,该值将是0xFFFFFFFFFFFF。确切地说,如何在F#中指定它,我不知道。

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

如果要使用有符号整数:

let myuint64 = 10uL match myuint64 with | -1 -> () | _ -> ()
但是,正如其他人所说,不能将负数与uint匹配。

您可以将其赋值为-1,并且在大多数体系结构中,将2的补码存储在其中。有符号和无符号的东西实际上只用于类型检查。硬件中没有负面符号

我不知道f#type checker是否足够聪明,知道词法常量-1是负数,不应该放在uint64中

C绝对不在乎

-1: int64
#包括
#包括
main()
{
uint64_t x=-1;
printf(“0x%x\n”,x);//0xffffffff
}

要扩展其他答案: 当类型以u开头时,表示未签名。有符号/无符号的意思是:

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

如果F#将为您转换,则-1UL将起作用。如果不是,则可以将其指定为0xFFFFFFFFFFFFFFUL,并添加注释以记住它是-1


目前没有安装F#工具,因此我无法验证这一点。

有些语言(如C)允许将a-1放在uint64#t中。因为2的补码可以被认为是一个正数。那么,您可以将表示-1的位模式作为有符号整数存储到无符号整数变量中。但是,使用该值会将其解释为正值,超出有符号整数的上限。1UL在F#中不起作用。但是0xFFFFFFFFFFFFFFUL确实有效。如果支持,只需确认。您也可以使用System.UInt64.MaxValue而不是长常量,正如“ssp”在其答案中指出的那样。这已成为公认的答案,但为了完整性,我认为读者应该参考以下答案,其中指出UInt64中的u表示未签名,所以它无论如何不能/不应该代表负数。
 #include <stdio.h>
 #include <inttypes.h>
 main()
 {
 uint64_t x = -1;
 printf("0x%x\n", x); // 0xffffffff
 }
> match 0UL-1UL with
-   |System.UInt64.MaxValue -> "-1"
-   |_ -> "???"
- ;;
val it : string = "-1"