如何在javascript中将整数转换为short

4

我在服务器端(c#)有一个整数变量a

int a = 65512;

当我将其转换为short类型时:(short)a等于-24

我希望在客户端(javascript)上进行此转换

我尝试首先将其转换为二进制:a.toString(2),然后执行a.toString(2) & 0xFF,但无效

如何在javascript端将数字强制转换为short类型?


1
在JavaScript中,不存在所谓的“强制类型转换”。此外,当在字符串和整数上使用二进制和&时,我不确定您期望发生什么。 - Patrick Roberts
是的,在JavaScript中没有特定的类型,我的意思是你不能定义它们,这是编译器的工作,因此使用“var”关键字,不要将其与C# var关键字混淆。 - Rainbow
期望的输出是-24,我知道在JavaScript中没有这种类型。 - Mehdi Souregi
4个回答

9
你可以使用TypedArray,具体来说是Int16Array,在JavaScript中将数字强制转换为特定的数值类型:

function toShort(number) {
  const int16 = new Int16Array(1)
  int16[0] = number
  return int16[0]
}

console.log(toShort(65512))


7
JavaScript没有intshort之类的类型,它有一个number类型,它是IEEE-754双精度二进制浮点类型(并且像Patrick Roberts的答案中的类型数组一样)。但是,对于某些操作,它就像拥有32位整数类型一样。
您可以取一个数字并使用位移运算符来丢失该32位值的一半,如下所示:

var a = 65512;
a = (a << 16) >> 16;
console.log(a);


什么是类型化数组的特殊之处?它们在内部不使用相同的“数字”吗? - Evk
1
@Evk:不是的,它们使用类型化数组的类型。因此,Int16Array使用16位整数,Float32Array使用32位浮点数等(有一个基本上是numberFloat64Array)。它们中的一个真正酷的事情是,您可以拥有具有不同位视图的底层位缓冲区。更多信息请参见MDN - T.J. Crowder
谢谢,我之所以有这样的印象(他们在内部使用数字),是因为没有Int64Array。 - Evk
@Evk 这是因为它们将被装箱为 Float64,这意味着整数精度不会被保留,因此没有意义拥有它们。 - Patrick Roberts
@PatrickRoberts 是的,我明白,但是如果他们内部不使用通常的数字类型,而是使用一些特殊的类型,如上所建议 - 为什么会有问题呢?我的意思是,他们可以引入真正的64位整数。 - Evk
@Evk:当您对它们进行操作时,它们会离开类型化数组并进入普通变量,因此变成了“number”,失去了整数精度,这是一个问题。Brendah Eich曾经提议过实际的64位int类型,我不知道为什么它失败了。但是通过BitInt proposal,64位int类型数组即将到来,用于任意精度ints,它具有显式支持64位int类型数组处理,并可以通过JS引擎优化为本地64位数学运算。 - T.J. Crowder

1
另一个选择是了解C#正在溢出该数字,因此您只需检查它是否超过了short的最大值32767(07FFF),然后减去int + 1的最大值65536(0x10000)。例如:

var number = 65512
var shortValue = number > 0x7FFF ? number - 0x10000 : number;
console.log(shortValue);


如果你在使用魔法数字,将6553632767分别替换为0x100000x7FFF可能会更容易理解。 - Patrick Roberts
0xFFFF不是655536 :) - DavidG

0

JavaScript不支持short等变量类型。你需要在服务器端处理确保数字是short类型,并在JavaScript端将其作为字符串保留。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接