好奇表达式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?
在这种情况下,Math.abs()
的使用将错误!
所讨论的值,因此上面的声明说,是UInt32
... 32位无符号整数。
这只是意味着最左边的位(最高有效位)不是被解释为符号位。但是,这不会防止您在某些情况下无意使用该值,而would假定MSB=1
表示“负”。
尽管如此,您使用abs()
将会是错误,因为如果找到MSB=1
,它将把整个位模式转换成完全不同的位模式。由于MSB只是“组成该值的32位中的一个”,因此假定它是一个符号位,对它执行任何操作都是错误的。您还需要注意,它永远不会显示为负数,因为它不会显示为负数。它不是带符号位的31位数量:而是32位数量。