65535=2^16-1在立即窗口里这么试:
?hex(65535)
FFFF这说明65535的十六进制表示是FFFF那么也就是,&HFFFF应该表示65535对吧?可是,奇怪的是,如果你在立即窗口这么试:
?&hFFFF
-1 VB它又告诉你这个FFFF其实是-1。这个我倒也勉强明白,因为是补码表示。让我晕的是,那么的话,我如果想让一个变量等于65535这个数,岂不是VB就会自动理解它是-1了么?
?hex(65535)
FFFF这说明65535的十六进制表示是FFFF那么也就是,&HFFFF应该表示65535对吧?可是,奇怪的是,如果你在立即窗口这么试:
?&hFFFF
-1 VB它又告诉你这个FFFF其实是-1。这个我倒也勉强明白,因为是补码表示。让我晕的是,那么的话,我如果想让一个变量等于65535这个数,岂不是VB就会自动理解它是-1了么?
65535是个变量??? &hFFFF 和 ? FFFF 是一样的????LZ??????
?FFFF
不会出任何结果啊 不信你试试看:)或者这么提问吧:你有什么办法 让一个用十六进制表示的65535在立即窗口还原为FFFF 么?
貌似声明了也没用啊。你试试下面这个
Public Sub test()
Dim i As Integer
Dim l As Long
i = &HFFFF
l = &HFFFF Debug.Print i, l
End Sub
Dim l1 As Long
Dim l2 As Long
l1 = &HFFFF
l2 = 65535
Debug.Print l1, l2
Debug.Print Hex(l1), Hex(l2)
End Sub
你用 hex 输出当然输出 &HFFFF,用十进制就会输出 -1,因为vb 把 65536 识别成了 有符号双字节类型了你在vb的理解窗口试试这个就知道了?&hffff& 输入之后打回车看看得到什么这里把 &hffff 强制按有符号4字节表示,就会出现,理想效果了
在vb的立即窗口...
? &HFFFF& + 回车
然后看结果
你把&HFFFF以 hex(&HFFFF) 输出,得到的肯定是 FFFF ,65535 的16进制文本形式
以十进制输出vb的有符号2字节整数就会得到 -1,因为vb总是自动把整数常数按照合适的类型进行格式化
对于小于65536 的整数自动格式化为 ingeter 大于等于的数将格式化为 long,比long 还大的数...没研究过,估计会转换为 single或者 double 吧
有符号整数在他的可表示范围内是一个递加和递减过程,但总的来讲他的值实际上总是递加的
Dim l1 As Long
Dim l2 As Long
l1 = "&HFFFF"
l2 = 65535
Debug.Print l1, l2
Debug.Print Hex(l1), Hex(l2)
End Sub
&HFFFF不是同一个东西:)
l1 = "&HFFFF"
l1将自动转换成lng类型,如果l1为string,那么l1就是一个字符串,
l1 = &HFFFF
l1 IDE不认识是什么,,所以返回-1
Dim i As Integer
Dim l As Long
i = &HFFFF
l = &HFFFF& '这个打印65535 Debug.Print i, l
另外,
可以考虑定义使用Byte数组来表示。
byte 和 string 才是赋值关系
long = string 所隐含的代码是 clng(string) 或者 val(string) 而不是 long = va/strptr(string)
我的意思是说vb里面只有 有符号双字节和四字节两种常用的整数
有符号双字节最大正整数是 32767? (忘了,你算算 65535/2-1),而常数 &hffff vb会识别成有符号双字节整数
的 - 1,因为-1的有符号双字节整数值和 65535 是一样的,而vb只能以 -1 来表示,因为他有符号- -!!! 我55..我不知道怎么说好了总之呢,一个数在一个类型的范围内能表示成什么样结果就是什么,比如 65535 在long的类型范围内是个正整数他就会表示为正整数 65535 ,否则,在 ingeter 的范围内超过了正整数的最大表示值 32767,只要这个值能用 ingeter表示就会表示成相应的,比如 -1,总之呢... 在ingeter里面 -1 = &hffff... 而在long里面 -1 = &hffffffff
Public Sub test()
Dim i As Integer
Dim l1 As Long
Dim l2 As Long
i = "&HFFFF"
l1 = "&HFFFF"
l2 = 65535
Debug.Print i, l1, l2
Debug.Print Hex(i), Hex(l1), Hex(l2)
End Sub
>这是个integer类型,所以就把它理解为-1了不是这意思, 长整形是 long, &hffff的值不会发生任何改变,改变的是表示方法,在 integer中 &hffff 就表示为 -1最好不要用什么补码之类的思路去理解,那样实际并不方便,直观的理解就是有符号整数数据类型就是包含负号,这个负号是数据表示方法,实际值是不是有任何改变的,只是在数据最高位以 0/1 来区分这个值是否为正或为负...>byte=string
这个东西相当于复制内存举个实例dim mulBits() as byte
dim vbstr as string
vbstr = "中国china"
mulbits=vbstr
然后你debug.print ubound(mulbits) 会 = 13,下标是 0
mulbits里面包含着vbstr的unicode值,他的实现方式是复制内存我所说的 long = string 意思是说 ,把一个 string 赋值给 long的时候,实际上,发生了一个 val 转换,而不是复制内存也不是简单的赋值,赋的值是经过转换过的,long得到的也不是string,是一个真正的数值
在编译常量时,如果没有指定类型,总是用最小的类型来存放。
&HFFFF 两字节,就用 Integer 类型存放,所以成了 -1。
要定义 65535 就必须用 &HFFFF&,有了后缀 & 就会强制用 Long 存放。
谢谢zhao,你说的真清楚,我其实大致理解了是这个意思的,就是没你说的这么笃定。呵呵。另外,我好像想不动了,那个unsigned算法。我不明白一个大整数(超过2^31)与&h80000000异或的实质。
谢谢。BYTE=string的意思理解了。但是你这句话貌似不对:“&hffff的值不会发生任何改变”。因为
l1=&hffff这个语句运行之后,l1里面存的是&hffffffff。高位加了4个f。你可以试试。
感觉你这段话,和soyokaze这段话很像:“符号只是人们为了运算简便而认为规定的,在硬件实现上,不论有无符号的两个数,MCU都同样放到全加器里进行加法运算,结果一样(指1、0的组合)的,只是解释不同,就代表两个不同的数。”是吧?