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

JavaScript C样式类型从有符号转换为无符号,javascript,Javascript,如何在javascript中键入强制转换数字 a = (unsigned int)atoi(arg1); b = (unsigned int)atoi(arg2); 假设a和b可以签名 我想将4字节有符号整数转换为4字节无符号整数 我知道javascript中没有类型转换或有符号/无符号。我正在寻找一种易于理解的算法。您可以尝试a=arg1>>0,但我不确定它是否能满足您的要求 有关更多详细信息,请参阅。Javascript中的所有(原语)数字都是IEEE748双精度,可以获得52位整数精度

如何在javascript中键入强制转换数字

a = (unsigned int)atoi(arg1);
b = (unsigned int)atoi(arg2);
假设a和b可以签名

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


我知道javascript中没有类型转换或有符号/无符号。我正在寻找一种易于理解的算法。

您可以尝试
a=arg1>>0
,但我不确定它是否能满足您的要求

有关更多详细信息,请参阅。

Javascript中的所有(原语)数字都是IEEE748双精度,可以获得52位整数精度

signed vs unsigned的问题在于,除了
>
之外的所有Javascript逐位运算符都将数字转换为32位有符号数字-也就是说,它们取最低有效位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]
var a=[1,2,3,4];//0x01020304
var unsigned=a[0]*(1您也可以使用

(new Uint32Array([arg1]))[0]
e、 g

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

  • 创建输入的自然数数组
  • 从该数字构造一个类型化数组(Uint32Array)。这是进行强制转换的地方
  • 提取该类型化数组的第一个(第0个)元素,该元素包含强制转换结果

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

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

    您不需要在Javascript中强制转换它。您可以将它用作int。虽然它最初是text。Javascript没有带符号和无符号的整数。它只有以下主要类型->text、number、boolean、object、function。我想从有符号转换为无符号。@matthia这4个字节值的来源是什么-它们已经是ASCII de了吗cimal字符串,还是4字节编码的字符串?我确实在找这个。var arg1=-1;var a=arg1>>>0警报(a);非常感谢您提供此解决方案。通过此方法,我能够以更优雅的方式进行求解。为什么我在尝试-5>>>0?-5时得到4294967291,因为有符号32位int看起来像
    11111111111111111111111111111 011
    ,当解释为无符号int时,它是4294967291。同样,在无符号int数学中,这也是0-5得到的结果。这是这是正确答案,没有问题。关于神奇的部分。计算机中的数据以位表示,一个字节是8位。要创建负数,请将最后一位设置为1。这意味着还剩下7位来存储数字(如果将最后一位设置为0,则7位用于存储加号;如果将最后一位设置为1,则7位用于表示负数)。这意味着没有什么神奇之处,您只需告诉编译器如何理解该值。例如,您可以将正数视为负数,如果您说,将其视为有符号数。(U在Uint32中表示无符号)迟来的添加了一个解释。救了我一天,谢谢
    -5 & 0xff // = 251   , signed to unsigned byte
    251 <<24 >>24 // = -5  , unsinged byte to signed
    
    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