crypto.getRandomValues(new Uint32Array(1))[0] / lim是否为负?

问题描述 投票:1回答:1

好奇表达式crypto.getRandomValues(new Uint32Array(1))[0] / lim是否可以为负。

我正在转换的代码在其周围放了一个Math.abs包装器,但是我们中的一些人认为它不可能是负数,所以只想看看其余的人会怎么想?

var lim = Math.pow(2, 32) - 1;
crypto.getRandomValues(new Uint32Array(1))[0] / lim);

这是有关更多上下文的相关问题:Converting getRandomValue.browser from cuid to Typescript?

javascript node.js typescript cryptography cryptojs
1个回答
0
投票

在这种情况下,Math.abs()的使用将错误!

所讨论的值,因此上面的声明说,是UInt32 ... 32位无符号整数。

这只是意味着最左边的位(最高有效位)不是被解释为符号位。但是,这不会防止您在某些情况下无意使用该值,而would假定MSB=1表示“负”。

尽管如此,您使用abs()将会是错误,因为如果找到MSB=1,它将把整个位模式转换成完全不同的位模式。由于MSB只是“组成该值的32位中的一个”,因此假定它是一个符号位,对它执行任何操作都是错误的。您还需要注意,它永远不会显示为负数,因为它不会显示为负数。它不是带符号位的31位数量:而是32位数量。

© www.soinside.com 2019 - 2024. All rights reserved.