问题标签 [signed-integer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 将 fortran 生成的二进制文件读入 C++ 中的有符号整数数组
我正在学习 C++。我想在 C++ 程序中读取一些由 fortran 程序生成的文件。我要读取的每个文件都包含一个数字列表,这些数字可以是 0、1 或 -1。这些数字是在 fortran 程序中定义的 1 字节整数数组的元素。下面写了一个示例 fortran 代码以及一个示例 C++ 代码(我尝试将文件读入一个无符号整数数组,开始时)。在 fortran 代码中,我在二进制文件中写入一个 1 字节整数数组,然后将该二进制文件读入数组并打印数组元素。当我尝试将相同的二进制文件读入 C++ 代码中的数组,然后打印数组元素时,输出是意外的。有人可以帮我做对吗?如果有人从 fortran 代码中给出第二个 do-loop 的 C++ 等效项,那就太好了。自从,
fortran90 代码:
输出:
1
1
C++ 代码:
c - 混合有符号和无符号整数的不合理行为
灵感来自此博客上“当我混合有符号和无符号整数时会发生什么?”下的代码片段。我决定用几个不同的有符号和无符号整数值运行它并观察行为。
这是原始片段(略有修改,但意图仍然相同)
输出:<1,4294967282>
a = 6
现在,当我为和运行相同的程序时b = -1
输出:<0,5>
如果我正确理解C 语言的积分提升规则,b=-1
应该提升为无符号整数,那就可以了4294967295
。就像原始示例一样,我们应该得到<1,4294967301>
. 但这不是我们得到的。
我能想到的这种行为的唯一原因是这些隐式类型转换发生在算术运算之后。然而,同一篇博客文章还说,首先提升有符号整数,然后进行评估,这使我的推理无效。
这种行为的真正原因是什么?以及这两个示例有何不同。
PS我知道有很多关于SO的问题与这个问题相似/相关。但是我没有遇到任何特别解决这个问题或有助于理解此类代码片段的问题。如果发现是重复的,我很乐意接受这个问题被关闭。
assembly - 汇编 imul 签名
谢谢帮助我的问题是关于从下面的代码中收到的 ax 值?
- 实际机器结果:
ff9a
- 我所期望的:(
00:9a
通过二进制相乘)
第一个数字是 22h 所以它的 34 十进制它已经无符号第二个数字是二进制的 fd 它像 11111101 所以它有符号意味着它像 -3
所以 22* -3 它的 66;和 -66 签署 9a
那为什么开头有ff
php - 声明“PHP 不支持无符号整数”实际上是什么意思?
我正在使用PHP 7.0.2
在整数手册的一处,我看到了以下语句:
整数可以用十进制(以 10 为基数)、十六进制(以 16 为基数)、八进制(以 8 为基数)或二进制(以 2 为基数)表示法指定,可以在前面加上符号(- 或 +)。
在手册的一个地方,我看到了以下矛盾的陈述:
PHP 不支持无符号整数。
由于这两个句子,我感到困惑。有一个地方说,一个整数前面可以有一个符号,这意味着每当我使用任何整数时,在它前面加一个符号(- 或 +)或不加号都是我的选择。
同时它说 PHP 不支持无符号整数。
那么,它是否说每当我使用任何整数而不在其前面加上符号(+ 或 -)时,它不会被视为 PHP 中的合法整数吗?
c - C - 三个字节转换为一个有符号整数
我有一个传感器,它以三个字节提供输出。我是这样读的:
现在我想将这三个字节合并为一个数字:
它给了我从 0 到 16,777,215 的值,但我期望值从 -8,388,608 到 8,388,607。我虽然int
已经签署了它的实施。即使我尝试定义它,signed int value;
它仍然只给我正数。所以我想我的问题是如何将 int 转换为它的二进制补码?
谢谢!
java - 在java中将两个字节转换为有符号整数
简短的问题
有没有办法将两个字节读取为有符号整数?
详细信息和示例
给定 java 中的两个字节,每个代表一个整数,我们可以将它们转换为它们一起表示的 int 值,只需:
当两位代表正整数时,它可以完美地工作。但是当两个整数为负时它会失败。例如,当:
我得到:
这是不正确的。它应该只是-8,即0xf8。
我尝试使用 ByteBuffer:
没用。得到相同的结果:
这些只是例子。会有更多字节,它们将代表正整数和负整数。
有没有办法将两个字节作为有符号整数读取并获得正确的结果?
提前致谢。
assembly - 将 32 位有符号整数存储到寄存器中的细节是什么?
我的数字类型是有符号的二进制补码整数。
在内存寄存器 %rdi/edi/di 中,我有 0xFFFFFFFF。在 %rsi/esi/si 中,我有 0x80000000。
我的指示是addl %edi, %esi
。
如何正确添加这些?
我认为答案是:
由于我要添加完整的 32 位寄存器,因此我可以添加完整的 0xFFFFFFFF 和 0x80000000。
所以,我有一个有符号整数添加到一个有符号的,它们都是 32 位的。我有效地添加了 -2147483648 和 0x80000000。由于 0x80000000 是十六进制的 2147483648,我将这两个相加得到零。
零标志被激活 进位标志被激活(因为我添加了 32 位寄存器的前导值)
c - 如何在C中实现算术右移
信号处理中的许多无损算法都需要评估 ⌊ 形式的表达式。a / 2 b ⌋,其中a , b是有符号(a可能为负,b为非负)整数,⌊·⌋ 是底函数。这通常会导致以下实现。
不幸的是,C 标准规定,>>
如果左操作数具有带符号类型和负值,则运算符的结果是实现定义的。
为了确保在所有平台上的正确行为,可以用多个 if-else 条件替换这个简单的函数,从而导致程序性能不佳。(必须处理整数溢出并考虑 is 的情况numerator
。INT_MIN
)
因此,我问,在 C 中实现算术右移的最佳实践是什么?理想情况下,我正在寻找编译成与上面代码片段相同的代码1的构造,同时避免实现定义的行为。
1考虑例如 gcc 和 x86-64 平台
更新:
经过一番思考,我意识到我在上面的问题中做出了错误的暗示。如果平台不使用二进制补码,则使用算术移位计算负数的下限函数是没有意义的。目标是实现表达式⌊ a / 2 b ⌋ 以便携的方式。
c - 将 int16_t 散列到 uint64_t
我正在尝试为int16_t
. 函数原型如下所示:
到目前为止,我已经得到了这个,但我不知道这是否是正确的方法:
有符号类型有哈希函数吗?我应该使用 16 位无符号整数或 64 位无符号整数来混合这些位吗?如果整数为负数,当我将其转换为无符号类型时,我会丢失信息吗?这会产生未定义的行为吗?
PS 代码在 C 中,我从这里获取了哈希函数。
编辑 1:该参数是const void *key
因为允许用户将键存储为其他值,如结构或字符串。上述功能将添加对int16_t
键的支持。
编辑2:我想要完成的是一个通用哈希表。初始化哈希表时,用户必须提供一个哈希函数,上面的示例与哈希表捆绑在一起。
c++ - 为什么为位字段分配值不返回相同的值?
我在这篇 Quora 帖子中看到了以下代码:
在 C 和 C++ 中,代码的输出都是出乎意料的,
被禁用 !!
尽管在那篇文章中给出了与“符号位”相关的解释,但我无法理解,我们怎么可能设置了一些东西,然后它就不能按原样反映。
有人可以给出更详细的解释吗?