let myuint64 = 10uL match myuint64 with | -1 -> () | _ -> ()
如何将给定的-1定义为uint64值?
答案 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#工具,因此无法验证。