问题标签 [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 投票
2 回答
246 浏览

c - C 中的移位、类型和符号扩展

我有以下代码:

现在结果将等于 18446744073340452864,它是1111 1111 1111 1111 1111 1111 1111 1111 1110 1010 0000 0000 0000 0000 0000 0000二进制的。

当 chr 未签名时,为什么要进行符号扩展?

此外,如果我将移位从 24 更改为 8,则结果为 59904,它是0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1110 1010 0000 0000二进制的。为什么这里没有扩展?(任何 23 或更少的班次都没有对其进行符号扩展)

在我当前的平台上sizeof(long)也是8。

转换时自动转换为更大尺寸类型的规则是什么?在我看来,如果移位是 23 或小于 chr 被强制转换为无符号类型,如果它是 24 或更大,它被强制转换为有符号类型?(以及为什么符号扩展甚至完全通过左移完成)

0 投票
6 回答
1844 浏览

java - 算术右位移位存在哪些实际用例?

我偶然发现了一个问题,询问您是否曾经在实际项目中使用过位移。我在许多项目中都广泛使用了位移,但是,我从来不必使用算术位移,即左操作数可能为负并且符号位应该移入而不是零的位移。例如,在 Java 中,您将使用运算符进行算术位移>>(而>>>将执行逻辑移位)。经过深思熟虑,我得出的结论是,我从未使用>>过可能为负的左操作数。

正如这个答案中所述,算术移位甚至是在 C++ 中定义的实现,因此 - 与 Java 相比 - C++ 中甚至没有用于执行算术移位的标准化运算符。答案还说明了一个有趣的问题,即我什至不知道的负数移位问题:

所以-63>>1产量-32在查看位时是显而易见的,但可能不是大多数程序员一见钟情。更令人惊讶(但在查看这些位时再次明显)是-1>>1-1不是0

那么,可能负值的算术右移的具体用例是什么?

0 投票
1 回答
415 浏览

c - C - 右移时看似无符号的整数被符号扩展?

所以我试图测试一个超短函数来让我从整数中获取某些位 x 到 y 的整数值,但是在发生符号扩展时遇到了一些问题。我尝试转换为无符号整数,然后使用无符号整数进行转换,但这似乎不起作用。代码如下:

我不明白为什么会发生符号扩展,因为我只移动了一个无符号整数。我还只使用“addr”运行代码并将其作为无符号整数,但这也没有改变输出。

当我在 linux 机器上运行 gdb 中的函数时,索引的输出值为 536870912,并且在在线编译(现在编码地面)时,我得到的值为 67108864。

编辑:有几个人问我是如何得到值 536870912 的,我已经让它通过两个断点运行 gdb 并p get_index(1)从 gdb 运行命令。实际代码如下:

感谢所有的帮助!

0 投票
1 回答
1013 浏览

java - Java 按位或在字节和整数之间

我正在尝试按位或按byte我在 Java 中的值执行。

例如,我正在运行:

我对此的预期结果是0b00000000 00000000 00000000 11111111, 或255。但是,我收到-1, 或0b11111111 11111111 11111111 11111111.

我假设 Java 在执行操作之前将 mybyte转换为intvia 符号扩展,我只是好奇是否有一种方法可以在不使用位掩码 ( 0b11111111) 的情况下获得我想要的结果。

0 投票
3 回答
312 浏览

c++ - char 数组到 long 会导致意外值

我试图将字节数组转换为长

我的转变似乎不对。对于预期值

我得到:

知道错误在哪里吗?

0 投票
3 回答
1429 浏览

c - C中的符号扩展,加法和减法二进制

我将如何在 C 代码中实现从 16 位到 32 位的符号扩展?
我应该使用按位运算符。我还需要加减;谁能指出我正确的方向?我做了前4个,但对其余部分感到困惑。对于其中一种情况,我还必须在某处合并一个for循环。

我不允许使用任何算术运算符(+, -, /, *),也不允许使用任何if语句。

这是我当前正在编辑的 switch 语句的代码:

0 投票
1 回答
2921 浏览

assembly - 这个汇编代码中发生了什么?

背景:我正在做一个“二元炸弹”任务,我必须通过 6 个不同的阶段来“化解”炸弹。我可以使用调试器来帮助跟踪值并逐步执行程序集的每一行。我被困在第二阶段。

目标:找到满足以下程序的此阶段的“密码”。正确的密码将使我进入下一阶段

我想我知道的:它看起来马上,它正在尝试读取 6 个数字。当我拆解整个炸弹的 main() 函数时,我注意到一行带有 "%d %d %d %d %d %d" 所以这个阶段必须需要 6 个数字。此外,看起来有一个从 1 开始并在计数器大于 5 后结束的循环。它似乎在内存的 -0x4(%rbp) 部分中被跟踪。它看起来像在线,它将 %eax 中跟踪的内容与用户输入的内容进行比较(之前存储在 %edx 中以查看它们是否相等。如果不是,炸弹就会爆炸。如果他们是,它将继续循环。

我不知道的:这里有一些我不熟悉的新指令。'cltq' 显然执行“将 %eax 符号扩展为 %rax”,但我不确定在这种情况下这意味着什么。另外,我不明白 'mov -0x20(%rbp, %rax, 4), %edx' 行以及它的确切作用。我知道它将存储在 0x20 中的内容移动到 %rdx 寄存器,但我不知道当时内存中的那个位置应该是什么。我知道在进行调试时,-0x20 处的 %rbp 包含我输入的 6 个值之一。但我不太确定 %rax 和 4 究竟做了什么。

如果有人能看到所需的 6 个数字是什么,那就太好了!如果没有,我希望有人至少可以阐明这段代码以及我必须帮助推动我朝着正确方向前进的问题!谢谢

我测试的一些错误解决方案:1 2 3 4 5 6;10 20 30 40 50 60

(我不想继续尝试,因为每次我引爆炸弹,我的作业成绩都会得到一分)

0 投票
0 回答
357 浏览

assembly - 添加没有符号扩展的值?

我知道 CPU 不关心符号位,因为二进制补码。但是当使用不同的操作数大小时,源值会被符号扩展到目标的大小。

是否有一条 add 指令可以在没有符号扩展的情况下添加值(并避免空字节)?

(我正在使用 x86_64 架构)

0 投票
0 回答
156 浏览

fortran - 用于位操作的 gfortran 符号扩展

我在zext()Sun Studio Fortan 编译器中使用该函数来转换integer(kind=1)integer(kind=4),以便能够使用ibits()函数操作位。

例如:

这个函数似乎不是 gfortran 编译器的一部分。

gfortran 中是否有等效功能?

0 投票
1 回答
2519 浏览

concatenation - 使用连接的符号扩展

我需要将 4 位数字的符号扩展为 32 位数字。我尝试像这样重复 MSB 28 次:

但是,我收到一个错误:

“{”附近的语法错误

x定义为:wire [31:0] x ;

a定义为:input [3:0]a;

这种连接是错误的吗?