问题标签 [sign-extension]

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.

0 投票
6 回答
3885 浏览

c - 签名右移=奇怪的结果?

我正在帮助某人完成家庭作业并遇到了这个奇怪的问题。问题是编写一个函数来反转有符号整数的字节顺序(这就是函数的指定方式),这是我想出的解决方案:

如果你传递0xFF000000给这个函数,第一个赋值将导致0xFFFFFFFF. 我真的不明白发生了什么,但我知道这与有符号和无符号之间的来回转换或类似的事情有关。

如果我追加ul0xFF它工作正常,我认为这是因为它被迫无符号然后转换为有符号或那个方向的东西。生成的代码也会发生变化;没有说明ul符,它使用 sar(右移算术),但作为无符号,它按预期使用 shr。

如果有人能为我阐明这一点,我将不胜感激。我应该知道这些东西,我以为我知道了,但我真的不确定这里发生了什么。

提前致谢!

0 投票
1 回答
25221 浏览

assembly - 对有符号/无符号加载和存储指令 (MIPS) 的说明

我似乎无法掌握这些东西的概念,即使有谷歌的帮助和我手中的教科书。

遵循格式(操作码、rs、rt、偏移量)...

  • 您是否在将偏移量添加到地址值之前签署扩展偏移量?还是在扩展之前添加?
  • lblbu的情况下,有什么区别?它是否也遵循 MIPS 算术定义,即“无符号”只是意味着它不会报告溢出?
  • 为什么lw没有未签名的版本?连店里的说明书都没有……
0 投票
1 回答
6147 浏览

assembly - movzwl、%ax 和负值的奇怪结果

好的,所以我正在处理以下代码片段:

因此,在处理正值时,它的行为符合预期。复制到 %edx 的值是 %eax(或 %ax)的尾随 16 位。

然而,如果你输入一个负数,一切都会变得很奇怪,而且它的行为似乎不像预期的那样。

例如,如果 %eax 的值为 -67043552,则复制到 %edx 的值为 65312。

我对组装很陌生,如果这对我来说是一个明显的误解,我很抱歉。任何帮助将不胜感激。

0 投票
1 回答
9564 浏览

assembly - 汇编语言:cbw

我不确定该cbw命令的实际作用。我有一段代码:

cbw后ax的值如何变化?

0 投票
4 回答
446 浏览

c - 符号扩展的必要性是什么?

考虑以下一段 C 代码 -

它涉及 -

  1. 将第二个参数转换为符号扩展。
  2. 将签名的扩展参数作为 b 推送到堆栈上。
  3. 将第一个参数转换为符号扩展。
  4. 将签名的扩展参数作为 a 推送到堆栈上。
  5. 添加 a & b,将结果转换为 char 并将其存储在 c 中。
  6. C 再次符号扩展。
  7. 符号扩展 c 被复制到返回值寄存器和函数返回给调用者。
  8. 要存储结果调用函数再次将 int 转换为 char。

我的问题是——

  1. 这是谁做的?
  2. 做这么多转换的必要性是什么?
  3. 它会降低/提高机器/编译器的性能吗?
  4. 如果它正在降低性能,我们应该怎么做才能提高它?
0 投票
2 回答
13331 浏览

constants - 在 MIPS 中移动符号扩展常量

为什么我们在 MIPS 的分支指令中将符号扩展的 16 位常量移动 2?我对这个想法感到困惑。这种移位对符号扩展的 16 位常数有什么好处。这是图片:

在此处输入图像描述

问候

0 投票
1 回答
292 浏览

assembly - 对大整数进行符号扩展的最有效代码是什么?

我正在用 x86-64 汇编语言编写一个代码库,为s0128s0256s0512s1024s2048和有s4096符号整数类型以及f0128f0256f0512f1024f2048f4096浮点数提供所有常规的按位、移位、逻辑、比较、算术和数学函数类型。

现在我正在编写一些类型转换例程,并且遇到了一些本应微不足道但需要的指令比我预期的要多得多的东西。我觉得我必须遗漏一些东西(一些说明)以使这更容易,但到目前为止还没有运气。

结果的低 128 位s0256只是s0128输入参数的副本,结果的高 128 位中的所有位都s0256必须设置为s0128输入参数中的最高有效位。

很简单吧?但这是迄今为止我能想到的最好的转换s0256s0128. 忽略前 4 行(它们只是参数错误检查)和最后 2 行(从没有错误的函数返回 (rax == 0))。中间的 5 行是有问题的算法。尽量避免[条件]跳转指令。

该例程也不是最优的,因为每条指令都需要前一条指令的结果,这会阻止任何指令的并行执行。

有没有更好的使用符号扩展来右移的指令?我找不到这样的指令vpshaq接受立即字节来指定移位计数,尽管我不知道为什么(许多 SIMD 指令具有用于各种目的的立即 8 位操作数)。此外,英特尔不支持vpshaq. 哎呀!

但看!StephenCanon 在下面为这个问题提供了一个绝妙的解决方案!惊人的!该解决方案的指令比上述多一条,但该vpxor指令可以放在第一vmovapd条指令之后,并且应该不会比上面的 5 条指令版本有效地占用更多的周期。太棒了!

为了完整和方便比较,这里是最新的 StephenCanon 增强的代码:

我不确定,但不需要从内存中读取这两个 64 位移位计数也可能会稍微加快代码速度。好的。

0 投票
1 回答
259 浏览

c++ - 使用 sprintf 打印十六进制值的便携式方法

我在二进制到(可打印)六进制转换方面遇到了一些麻烦。我已经达到了编写代码的功能(对于我的系统)方式,但我需要知道它是否在所有系统(操作系统和硬件)上都是可移植的。

所以这是我的函数(试图从一段二进制文本构造一个 UUID):

我明白,由于符号扩展,如果我使用char而不是unsigned charC++ 读取二进制文件并转换为十六进制),我的值不会很好地打印出来。分别接受和修改。

但是我遇到了更多这样做的变体:Conversion from binary file to hex in C,我真的迷路了。在 unwind 的代码中:

我不明白为什么,虽然数组是 unsigned char (由提出问题的人在原始发布的代码中定义),但需要强制转换为unsigned int,并且还需要对要转换的字节进行按位与...

所以,由于我不太了解符号扩展的事情,你能告诉我至少我写的这段代码是否适用于所有系统吗?

0 投票
1 回答
343 浏览

c++ - 错误的符号扩展 c++/qt

我在 Desktop x64 Intel 架构(gcc 编译器、linux)和 RaspberryPi Arm(gcc 交叉编译器)上运行以下代码。

其中ref是一个QByteArray

我注意到,尽管强制转换 quint32(它是无符号整数),但当给定字节为负数时,我的 PC 会执行导致错误的符号扩展。我的代码在 Arm 上运行良好。为什么会发生这种情况?我认为铸造应该防止这种情况。不是吗?

拆卸:

我还注意到,编译器使用 QByteRef 返回值而不是 char。但我猜它不应该导致任何错误。

来自QByteArray帮助页面:

提前致谢

0 投票
1 回答
3632 浏览

mips - 关于 MIPS 中的 addi 指令

我了解到符号扩展发生在 MIPSaddi指令的立即值中。(http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/addi.html

但是,我不确定它何时会扩展到负值。

我试过了

这段代码,qtSpim 给出了以下错误。

立即值 (32768) 超出范围 (-32768 .. 32767) 在文件 addi $t0, $0, 0x8000 的第 3 行

为了将符号扩展到负值,MSB 必须为“1”,但它超出了立即值的范围。

所以,我猜是addi不是“实际上”碰巧是符号扩展的。我猜对了吗?

或者如果没有,你能告诉我我在哪里犯了错误吗?还有一个符号扩展的例子会有很大帮助:)