JavaScript C样式类型从签名转换为无符号

Mat*_*ost 11 javascript

如何在javascript中输入一个数字?

a = (unsigned int)atoi(arg1);
b = (unsigned int)atoi(arg2);
Run Code Online (Sandbox Code Playgroud)

假设a和b可以签名.

我想将4字节有符号整数转换为4字节无符号整数.

我知道在javascript中没有类型转换或签名/未签名的东西.我正在寻找一个易于理解的算法.

Vat*_*tev 27

你可以尝试a = arg1>>>0,但我不确定它会做你想要的.

有关详细信息,请参阅此问题.

  • 我正是在寻找这个。 (2认同)
  • var arg1 = -1; var a = arg1 >>> 0 alert(a); (2认同)

jot*_*oth 9

你也可以用

(new Uint32Array([arg1]))[0]
Run Code Online (Sandbox Code Playgroud)

例如

< (new Uint32Array([-1]))[0]
> 4294967295
Run Code Online (Sandbox Code Playgroud)

说明:JavaScript不遵循像C这样的传统机器架构整数转换约定,更喜欢类型简单性和可移植性而不是低级效率.然而,JavaScript中的类型数组(Uint8Array等)是专门为了有效和良好定义的多字节和位级操作而添加的.因此,我们可以利用这个事实来访问定义良好的内置位转换操作.上例中的语法:

  1. 创建输入的自然数数组
  2. 从该数字构造一个类型化数组(Uint32Array).这就是案件发生的地方.
  3. 提取该类型数组的第一个(第0个)元素,其中包含转换结果.


Shi*_*kin 5

将有符号字节转换为无符号字节,javascript:

-5 & 0xff // = 251   , signed to unsigned byte
251 <<24 >>24 // = -5  , unsinged byte to signed
Run Code Online (Sandbox Code Playgroud)

第一个使除第一个字节外的所有第一位都为 0

第二个发现于

https://blog.vjeux.com/2013/javascript/conversion-from-uint8-to-int8-x-24.html

基本上,在一个数字中,有 4 个字节。在正数中,前 3 个字节为 0,所有 0 位均为零。在负数中,前 3 个字节为 1,所有 0 位均为 1,所有 1 位均为零。以字节为单位,第 4 个字节的最高有效位用于符号;

向左移动位使第 1 个字节的第 1 位 1 成为第 4 个字节的第 1 位,然后再次向右移动,将最高有效位拖过。所以如果符号位是 1。它在前 3 个字节中有很多 1 位。所以这是转移的副作用,但它有效。

for example: like you start from
?1111111 the first bit is a sign bit - ?, 
but in a larger variable,  so it is:

00000000_00000000_00000000_?1111111
shift to left
?1111111_........_........_........
shift to right
????????_????????_????????_?1111111
this is the effect,
it drags the edge bit across the shift
Run Code Online (Sandbox Code Playgroud)