为啥 java.util.zip.CRC32.getValue() 返回一个 long 而不是 int?

Posted

技术标签:

【中文标题】为啥 java.util.zip.CRC32.getValue() 返回一个 long 而不是 int?【英文标题】:Why does java.util.zip.CRC32.getValue() return a long, not an int?为什么 java.util.zip.CRC32.getValue() 返回一个 long 而不是 int? 【发布时间】:2013-06-09 05:06:30 【问题描述】:

见标题。返回值是 32 位,对吧?为什么不返回一个 int?

【问题讨论】:

【参考方案1】:

java.util.zip.CRC32 实现了Checksum 接口,该接口需要getValue() 的返回类型为long,因此对于32 位校验和需要long;输出的高 32 位几乎肯定是 0。

【讨论】:

【参考方案2】:

因为如果它返回一个 int,一半的 CRC 将是负数。期望是 32 位 CRC 是无符号的,即 0..4294967295,不能用 int 表示。

【讨论】:

马克,谢谢你的回答。我有一个后续行动:我正在读取和写入最后一个字节是所有前面字节的 CRC 的文件。 CRC 必须适合 4 个字节。所以我不能只忽略长 CRC 的前 4 个字节,可以吗?我需要先将 long 转换为“无符号”表示,对吗? 根据定义,32 位 CRC 适合 long 的低四个字节。 Java 中没有无符号的 32 位类型。 Java 语言不支持无符号整数类型这一事实与此无关。有符号或无符号的任何 32 位值都可以存储在 32 位大小的 Java int 中。 @bughouse26 然而,这就是原因。

以上是关于为啥 java.util.zip.CRC32.getValue() 返回一个 long 而不是 int?的主要内容,如果未能解决你的问题,请参考以下文章

你应该同步运行方法吗?为啥或者为啥不?

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]