在JavaScript中,"0"代表什么?

3

我正在使用seikichi在github上发布的tiff.js,这是LibTIFF C代码的编译版本。在我的代码中,我需要获取一些TIFF标签。在tiff.js中,您可以调用tiff.getField(tag value)方法。我特别需要的一个标签是ROWSPERSTRIP,其值为278,因此我按如下方式调用:

var rps = tiff.getField(278); //return rows per strip tiff tag

这似乎对一些较小的值1到176(还不确定?)可以正常工作,但我有几个文件,AsTiffTagViewer报告每个条带有224行,以及一个具有746行每个条带的文件。然而,tiff.js错误地将这两个值都报告为6和1。我正在使用tiff.js调试器,注意到它来到了一个具有以下代码的位置:

do{if(b>>>0<=65535){d=e[j+24>>1]|0;if((1<<(d&31)&c[a+40+(d>>>5<<2)>>2)]|0)==0){k=0}else{break}i=f;return k|0}}while(0);

这段代码看起来很丑,这可能是Emscripten将C代码转换后的最佳结果。现在我知道">>"和"<<"是什么意思,但似乎找不到关于">>>"的信息。我还不确定是否是tiff.js中的这段代码导致tiff.getField(278)不能正确返回一些更大的行每条带值(目前只知道它似乎能正确返回较小的行每条带值而无法正确返回较大的)。所以我的主要问题是">>>"是什么意思,我的第二个问题是有没有人有任何关于为什么tiff.getField(278)对于较大的值可能无法正常工作的想法。注意:大多数其他基本的TIFF标签确实返回正确的值,例如tiff.getField(PHOTOMETRIC)和tiff.getField(SAMPLESPERPIXLE)等等。

提前感谢你们的想法。


这是无符号右移运算符。 - Anindya Dutta
2个回答

6
这是一种按位零填充右移,来自MDN 该运算符将第一个操作数向右移动指定的位数。向右移动的多余位被丢弃。从左侧移入零位。符号位变为0,因此结果始终为非负数。
对于非负数,零填充右移和符号传播右移产生相同的结果。例如,9 >>> 2产生2,与9 >> 2相同:
至于为什么 tiff.js在调用tiff.getField(278)时不起作用,我不知道,我认为它应该可以,并且在Github页面上似乎没有任何已知问题,但您可以尝试添加问题并查看开发人员是否知道。

2

-3 >>> 0 是一个无符号右移0位。也就是说,这个数字被转换为一个 32位无符号整数,而不是像 -3 | 0 这样将数字转换为32位有符号整数。

-3 >>> 0 === 4294967293
-3 | 0 === -3

11.7.3 无符号右移位运算符 ( >>> )

对左操作数进行零填充的按位右移位运算,移动的位数由右操作数指定。

产生式 ShiftExpression : ShiftExpression >>> AdditiveExpression 的求值过程如下:

  1. 计算 ShiftExpression 的结果并将其赋值给 lref

  2. 计算 GetValue(lref) 的结果并将其赋值给 lval

  3. 计算 AdditiveExpression 的结果并将其赋值给 rref

  4. 计算 GetValue(rref) 的结果并将其赋值给 rval

  5. lval 转换为一个 32 位无符号整数并将其赋值给 lnum

  6. rval 转换为一个 32 位无符号整数并将其赋值给 rnum

  7. rnum 按位与上 0x1F,即保留最低的 5 位,并将其赋值给 shiftCount

  8. 通过将 lnum 向右移动 shiftCount 位来执行零填充右移位运算。空出的位将填充为零。 结果是一个无符号的 32 位整数。


我认为你不能称位移操作本身为“无符号”。位移操作可以影响符号位,但它本质上并不是“无符号”的。 - Alex W
"-3 >>> 0" 被称为无符号移位,因为该数字像一个无符号的32位数字一样被处理。"-3 >> 0" 是有符号移位(算术移位),因为它扩展了左操作数的符号。我猜 Emscripten 使用 >> 0 而不是 | 0 是因为它可以节省一个字节。 - Kijewski
似乎两者都被使用:c[a+40+(d>>>5<<2)>>2)]|0 - Bonsaigin
@Bonsaigin,是的,因为有些变量是有符号的,有些是无符号的。我只是指 X >> 0 在 Emscripten 中没有被使用。 - Kijewski
感谢大家提供“>>>”相关信息,我本应该能够找到这些信息,但我不知道为什么找不到。有趣的是,如果你在谷歌上搜索“>>>”,好像没有任何结果?我已经联系了seikichi关于tiff.js为什么在某些值n较大时无法正确获取tiff.getField(278)的值。我一直在将结果与AsTiffTagViewer进行比较,对于较大的值,tiff.js的结果是错误的。 - Neal Davis

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