JS进制转换的一个小问题_JS 进制转换

问题

  JS 有符号与无符号转换的问题。

  如:0xf5 转 十进制, 使用 parseInt('f5', 16) 进行转换,结果为:245。结果没错,但不是我想要的结果。

  JS 在转换时,把 0xf5 看作是无符号的,高位字节为 0。可能为:0x000000f5 (二进制为 00000000000000000000000011110101), 其转换为十进制自然是 245。

  但是我想要的是把 0xf5 看作是有符号的,高位字节为1。可能为:0xf5(二进制为 11110101),其转换结果为:-11。

   JS进制转换的一个小问题_JS 进制转换JS进制转换的一个小问题_JS 进制转换

 

 

 

解决方法

  问题原因就是,js默认把0xf5看作是一个无符号的。那么解决方法就是把0xf5看作是有符号的。

  解决办法有两个:

  1:使用 Int8Array 包装一下:

  JS进制转换的一个小问题_JS 进制转换

  Int8Array默认转成了10进制。取出来即可。

  

  而如果使用Uint8Array:则是无符号的,结果为 245。

  JS进制转换的一个小问题_JS 进制转换

 

   

  2:(不推荐)将高位字节转换为1,也就是把 00000000000000000000000011110101 改为 11111111111111111111111111110101:

  直接使用按位或操作:将 0xf5 按位或 0xffffff00:

  JS进制转换的一个小问题_JS 进制转换

 

   这种方法是强制将高位字节改为 1。此方法弊端是如果数字较大或较小,或的值就需要跟着变。

 

  3:此种方法跟第二种差不多,但更通用。

  此种方法是使用按位与操作:将0xf5 按位与 0xffffffff,但要注意的是,0xf5 与 0xffffffff 的字节必须一样。也就是将 0xf5 修改为 0xfffffff5。

  JS进制转换的一个小问题_JS 进制转换

   0xfffffff5 与 0xffffffff 操作后还是 0xfffffff5,但他已经是有符号的了。所以结果为有符号的。

  JS进制转换的一个小问题_JS 进制转换

 

 

总结(进制转换)

  1:有符号转换

    十六进制 转 十进制:

1 parseInt(new Int8Array(['0xf5'])) // -11
2 new Int8Array(['0xf5'])[0]  //-11
3 parseInt('0xffffff' + 'f5' & '0xffffffff') // -11

    十进制 转 十六进制:

1 new Uint8Array(['-11'])[0].toString(16) // f5

  

  2:无符号转换

    十六进制 转 十进制:

1 parseInt(new Uint8Array(['0xf5'])) //245
2 new Uint8Array(['0xf5']) //245
3 parseInt('0x' + 'f5' & '0xffffffff') //245
4 parseInt('f5', 16) //245

    十进制 转 十六进制:

1 parseInt(245).toString(16) // f5
2 new Uint8Array(['245'])[0].toString(16) //f5

 

上一篇:JavaScript面试大师_Number类型


下一篇:超级简易的加法计算器