17

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

a = (unsigned int)atoi(arg1);
b = (unsigned int)atoi(arg2);

假设 a 和 b 可以签名。

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

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

4

4 回答 4

43

您可以尝试a = arg1>>>0,但我不确定它会满足您的需求。

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

于 2013-02-15T09:03:35.920 回答
15

你也可以使用

(new Uint32Array([arg1]))[0]

例如

< (new Uint32Array([-1]))[0]
> 4294967295

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

  1. 创建输入的自然数数组
  2. 从该数字构造一个类型化数组 (Uint32Array)。这是演员将发生的地方。
  3. 提取该类型数组的第一个(第 0 个)元素,其中包含转换结果。
于 2014-10-23T20:57:38.677 回答
5

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

-5 & 0xff // = 251   , signed to unsigned byte
251 <<24 >>24 // = -5  , unsinged byte to signed

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

第二个发现于

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

基本上,在一个数字中,有 4 个字节。在正数中,前 3 个字节为 0,所有 0 位均为零。在负数中,前 3 个字节为 1,所有 0 位均为 1,所有 1 位均为 0。以字节为单位,第 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
于 2019-05-29T17:31:37.793 回答
3

Javascript 中的所有(原始)数字都是 IEEE748 双精度数,为您提供 52 位整数精度。

有符号与无符号的问题在于,除了>>>将数字转换为 32 位有符号数字之外,所有 Javascript 位运算符 - 也就是说,它们采用最低有效 32 位并丢弃其余位,然后得到的位 31 是符号扩展以给出带符号的结果。

如果您从四个已知的字节值开始,您可以通过使用简单的乘法和加法来解决按位运算符的问题,而不是使用所有 52 位整数精度,例如

var a = [ 1, 2, 3, 4];  // 0x01020304
var unsigned = a[0] * (1 << 24) + a[1] * (1 << 16) + a[2] * (1 << 8) + a[3]
于 2013-02-15T09:14:54.797 回答