65535=2^16-1在立即窗口里这么试:
?hex(65535)
FFFF这说明65535的十六进制表示是FFFF那么也就是,&HFFFF应该表示65535对吧?可是,奇怪的是,如果你在立即窗口这么试:
?&hFFFF
-1 VB它又告诉你这个FFFF其实是-1。这个我倒也勉强明白,因为是补码表示。让我晕的是,那么的话,我如果想让一个变量等于65535这个数,岂不是VB就会自动理解它是-1了么?

解决方案 »

  1.   

    65535=2^16-1 
    65535是个变量???  &hFFFF 和  ?  FFFF   是一样的????LZ??????
      

  2.   


    ?FFFF
    不会出任何结果啊 不信你试试看:)或者这么提问吧:你有什么办法 让一个用十六进制表示的65535在立即窗口还原为FFFF 么?
      

  3.   


    貌似声明了也没用啊。你试试下面这个
    Public Sub test()
        Dim i As Integer
        Dim l As Long
        
        i = &HFFFF
        l = &HFFFF    Debug.Print i, l
    End Sub
      

  4.   

    这个sub可能更能说明我的问题:Public Sub test()
        Dim l1 As Long
        Dim l2 As Long
        
        l1 = &HFFFF
        l2 = 65535
        
        Debug.Print l1, l2
        Debug.Print Hex(l1), Hex(l2)
    End Sub
      

  5.   

    &HFFFF 和 65535 是相等的啊...
    你用 hex 输出当然输出 &HFFFF,用十进制就会输出 -1,因为vb 把 65536 识别成了 有符号双字节类型了你在vb的理解窗口试试这个就知道了?&hffff& 输入之后打回车看看得到什么这里把 &hffff 强制按有符号4字节表示,就会出现,理想效果了
      

  6.   


    在vb的立即窗口...
    ? &HFFFF& + 回车
    然后看结果
      

  7.   

    --! 好像说的不清楚, 65536 的16进制数就是 &HFFFF
    你把&HFFFF以 hex(&HFFFF) 输出,得到的肯定是 FFFF ,65535 的16进制文本形式
    以十进制输出vb的有符号2字节整数就会得到 -1,因为vb总是自动把整数常数按照合适的类型进行格式化
    对于小于65536 的整数自动格式化为 ingeter 大于等于的数将格式化为 long,比long 还大的数...没研究过,估计会转换为 single或者 double 吧
    有符号整数在他的可表示范围内是一个递加和递减过程,但总的来讲他的值实际上总是递加的
      

  8.   

    哎,,,眼睛都不坚啊,,LZ啊你可能代码写多了,眼花了,,哎~~~~,直接代码了,不多说了Private Sub Form_Load()
        Dim l1 As Long
        Dim l2 As Long
        
        l1 = "&HFFFF"
        l2 = 65535
        
        Debug.Print l1, l2
        Debug.Print Hex(l1), Hex(l2)
    End Sub
      

  9.   

    "&HFFFF"
    &HFFFF不是同一个东西:)
      

  10.   

    Dim l1 As Long
    l1 = "&HFFFF"
    l1将自动转换成lng类型,如果l1为string,那么l1就是一个字符串,
    l1 = &HFFFF
    l1 IDE不认识是什么,,所以返回-1
      

  11.   


        Dim i As Integer
        Dim l As Long
        
        i = &HFFFF
        l = &HFFFF&               '这个打印65535    Debug.Print i, l
    另外,
    可以考虑定义使用Byte数组来表示。
      

  12.   

    谢谢各位,结帖了。小结在这里:http://blog.csdn.net/slowgrace/archive/2009/04/28/4132758.aspx
      

  13.   

    long 和 string 是转换关系不是赋值关系
    byte 和 string 才是赋值关系
    long = string 所隐含的代码是 clng(string) 或者 val(string) 而不是 long = va/strptr(string)
      

  14.   

    另外,亲爱的m60a1,你好像误解我的意思了,呵呵。可以看一下我在16楼的小结帖。不过还是感谢你的热情参与:P
      

  15.   

    sorry, m60a1刚才我没试你的代码,发现你的办法也挺妙的。谢谢啊。
      

  16.   

    晕了,看了你blog里面的文章,你理解错了我的意思了......
    我的意思是说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
      

  17.   

    to m60a1:
    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
      

  18.   

    啊... 狂汗啊,可不是那意思......>你把&HFFFF赋给一个长整型变量的时候,VB会自动认为
    >这是个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,是一个真正的数值
      

  19.   

    16进制值本身是无符号的,但是 VB 的 Integer/Long 都是有符号的。
    在编译常量时,如果没有指定类型,总是用最小的类型来存放。
    &HFFFF 两字节,就用 Integer 类型存放,所以成了 -1。
    要定义 65535 就必须用 &HFFFF&,有了后缀 & 就会强制用 Long 存放。
      

  20.   


    谢谢zhao,你说的真清楚,我其实大致理解了是这个意思的,就是没你说的这么笃定。呵呵。另外,我好像想不动了,那个unsigned算法。我不明白一个大整数(超过2^31)与&h80000000异或的实质。
      

  21.   


    谢谢。BYTE=string的意思理解了。但是你这句话貌似不对:“&hffff的值不会发生任何改变”。因为
    l1=&hffff这个语句运行之后,l1里面存的是&hffffffff。高位加了4个f。你可以试试。
      

  22.   


    感觉你这段话,和soyokaze这段话很像:“符号只是人们为了运算简便而认为规定的,在硬件实现上,不论有无符号的两个数,MCU都同样放到全加器里进行加法运算,结果一样(指1、0的组合)的,只是解释不同,就代表两个不同的数。”是吧?