none
integer 是否可以強制轉 short RRS feed

  • 問題


  • 最近在寫三菱PLC通訊程式,目前遇到如上圖問題,需要將 integer 轉 short 才能正確顯示負數。

    但如果再VB上,會出現錯誤:數學運算導致溢位,想請問該如何作轉換呢??

    2016年11月2日 上午 12:59

解答

  • 我剛想起來還有一種做法

            Dim x As System.Int32 = 65535
            Dim xa As Byte() = BitConverter.GetBytes(x)
            Dim y As System.Int16 = BitConverter.ToInt16(xa, 0)
            Console.WriteLine(y)
    
            Console.ReadLine()


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年11月2日 上午 01:49
    版主
  • 沒除錯,應該可以用。

    Dim sourceInt32(0) As Integer = 65535
    Dim targetInt16(1) As Short 
    Buffer.BlockCopy(sourceInt32, 0, targetInt16, 0, 4)
    ' 因為 Windows 是 低位元排列 (little endian byte order) ,所以
    targetInt16(0) = &HFFFF
    targetInt16(1) = &H0000
    

    關於 低位元排列 (little endian byte order)

    假設

    sourceInt32(0) = &H12345678

    在記憶體內為 78 56 34 12

    複製到

    targetInt16 時,就會變成

    targetInt16(0) = &H5678

    targetInt16(1) = &H1234


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年11月2日 下午 02:44

所有回覆

  • Dim a As String = Hex(65535)
    a = a.PadLeft(8, "0")
    a = Mid(a, 5, 4)
    Return Convert.ToInt16(a, 16)

    有試過這樣式可以的
    2016年11月2日 上午 01:30
  • 嗨,

    試試看這樣

    Dim vIn As Integer = 0
    Dim vOut As Short = Convert.ToInt16(vIn)

    參考:

    http://www.convertdatatypes.com/Convert-Integer-to-Short-in-VB.net.html

    2016年11月2日 上午 01:31
  • 目前看起來, 的確轉 16 進位字串再轉回來是比較可能的解法.

            Dim x As System.Int32 = 65535
            Dim b As String = Convert.ToString(x, 16)
            Dim y As System.Int16 = Convert.ToInt16(b, 16)


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年11月2日 上午 01:43
    版主
  • 我剛想起來還有一種做法

            Dim x As System.Int32 = 65535
            Dim xa As Byte() = BitConverter.GetBytes(x)
            Dim y As System.Int16 = BitConverter.ToInt16(xa, 0)
            Console.WriteLine(y)
    
            Console.ReadLine()


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年11月2日 上午 01:49
    版主
  • 沒除錯,應該可以用。

    Dim sourceInt32(0) As Integer = 65535
    Dim targetInt16(1) As Short 
    Buffer.BlockCopy(sourceInt32, 0, targetInt16, 0, 4)
    ' 因為 Windows 是 低位元排列 (little endian byte order) ,所以
    targetInt16(0) = &HFFFF
    targetInt16(1) = &H0000
    

    關於 低位元排列 (little endian byte order)

    假設

    sourceInt32(0) = &H12345678

    在記憶體內為 78 56 34 12

    複製到

    targetInt16 時,就會變成

    targetInt16(0) = &H5678

    targetInt16(1) = &H1234


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年11月2日 下午 02:44