加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

vb.net – 为什么True等于-1

发布时间:2020-12-17 00:28:37 所属栏目:大数据 来源:网络整理
导读:我想知道为什么True等于-1而不是1.如果我记得在C中正确(在日子里),“true”将等于1. Dim t,f As Integer t = True f = False Console.WriteLine(t) ' -1 Console.WriteLine(f) ' 0 Console.ReadLine() 当您将非零数字转换为布尔值时,它将评估为True.例如: D
我想知道为什么True等于-1而不是1.如果我记得在C中正确(在日子里),“true”将等于1.
Dim t,f As Integer

    t = True
    f = False

    Console.WriteLine(t) ' -1
    Console.WriteLine(f) ' 0
    Console.ReadLine()
当您将非零数字转换为布尔值时,它将评估为True.例如:
Dim value As Boolean = CBool(-1) ' True
Dim value1 As Boolean = CBool(1) ' True
Dim value2 As Boolean = CBool(0) ' False

但是,正如你所指出的,任何时间你将一个Boolean设置为True到一个整数,它将评估为-1,例如:

Dim value As Integer = CInt(CBool(1)) ' -1

原因是因为-1是其所有位等于1的有符号整数值.由于布尔值作为16位整数存储,所以简单的NOT’所有这些位,而不是只有不是最低有效位.换句话说,为了使True成为1,它必须像这样存储:

True  = 0000000000000001
False = 0000000000000000

但是,这样更容易存储:

True  = 2222222222222221
False = 0000000000000000

原因很简单是因为在低级别:

2222222222222221 = NOT(0000000000000000)

鉴于:

0000000000000001 <> NOT(0000000000000000)
0000000000000001 = NOT(2222222222222220)

例如,您可以使用Int16变量复制此行为:

Dim value As Int16 = 0
Dim value2 As Int16 = Not value
Console.WriteLine(value2) ' -1

如果您使用无符号整数,这将更为明显,因为此时True值是最大值而不是-1.例如:

Dim value As UInt16 = CType(True,UInt16) ' 65535

那么,真正的问题是,为什么在世界上VB.NET使用16位来存储单个位值.真正的原因是速度.是的,它使用16倍的内存量,但一个处理器可以做16位布尔运算比它可以做单位布尔运算快得多.

-1的原因是存储为2222222222222221而不是1000000000000001,正如你所期望的那样(第一个位是符号位,其余的是正常值),是因为它被存储为二进制补码.将负数存储为二进制补码意味着算术运算要更容易处理器执行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读