标签: twos-complement

将 2 的补码字节转换为 Java 中的无符号正值

我在 Java 中有一个 8 位字节数组。字节数组由它从外部传感器接收的 16 位数字的高字节和低字节组成。

例如,字节数组可能如下所示:

00 00 00 01 00 02 00 03
0  1  2  3  4  5  6  7
Run Code Online (Sandbox Code Playgroud)

在上面的字节数组中,每个偶数索引是一个 16 位数字的高字节,每个奇数索引是低字节。

我遇到的问题是当数字大于 127 时,导致数字的 2 的补码表示占上风。我真正想做的是保留 POSITIVE 无符号数。因此我不关心 2 的补码。这是我尝试做但没有成功的事情。

byte[] buffer = new byte[1024]; 

//SOME CODE SNIPPET THAT PUTS NUMBERS B/W 0-500 INTO THE BUFFER RANDOMLY

for(int i = 0; i < 1024; i+=2) {
    int twoByte = 0;
    short high = 0, low = 0;
    high = (short)buffer[i];
    low = (short)buffer[i+1];
    twoByte …
Run Code Online (Sandbox Code Playgroud)

java android byte bytearray twos-complement

1
推荐指数
1
解决办法
4252
查看次数

将 int 转换为带有额外内容的 32 位二进制行

用户输入一个 8 个字符的字符串,然后将其转换为字符串并放入要播放的数组中。

有了这 8 位数字,我希望能够将它们转换为 32 位二进制,例如

  • 0000 0000 0000 0000 0000 0000 0000 0000

整数 = 12,345,678

  • 0000 0000 1011 1100 0110 0001 0100 1110

整数 = -10,000,000

  • 1111 1111 0110 0111 0110 1001 1000 0000

     System.out.print("Please enter an 8 digit number");
     System.out.println();
     Scanner user_input = new Scanner( System.in );
     StudentID = user_input.nextLine();
     sID = Integer.parseInt(StudentID);
     String ss[] = StudentID.split("");
     StudentID = Integer.toBinaryString(sID);   
    
        while(loop >= 0){
          d[loop] = Integer.parseInt(ss[loop]) ;
          loop--;
        }
    
    Run Code Online (Sandbox Code Playgroud)

我试过使用“StudentID = Integer.toBinaryString(sID);” 然而,它不会产生加 0 来组成 …

java binary twos-complement

1
推荐指数
1
解决办法
6329
查看次数

为什么最小可能整数的否定会产生自身?

所以我使用 C 语言和 64 位机器编写了一个测试下溢和溢出的小实验。对于 int 类型,最小/最大值为:

   int tmax = 2147483647;
   int tmin = -2147483648;
Run Code Online (Sandbox Code Playgroud)

我知道二进制补码是如何工作的,这不是我的问题。

所以我想,如果我做了一些负面的事情会发生什么?那是:

   int tmin = -2147483648;
   int negativeTmin = -tmin;
Run Code Online (Sandbox Code Playgroud)

结果还是tmin。(也就是说,负Tmin将为-2147483648)

我的问题是为什么会这样?由于正 2,147,483,648 不能用 int 表示,我理解为什么它当然不是这样,但它根本没有改变似乎很奇怪,因为这使得它成为应用 - 时唯一不会改变的非零 int到它。我并不是说我对它应该是什么有更好的了解,我只是好奇为什么 -tmin == tmin。它是否与按位运算有关,或者与计算机中如何进行减法有关,或者它是否默认这样做,因为我想要做的事情是未定义的,或者其他什么?

我的代码:

#include <stdio.h>
int main() {
   int tmax = 2147483647;
   printf("tmax Before: %d\n", tmax);
   tmax++;
   printf("tmax After: %d\n\n", tmax);

   int tmin = -2147483648;
   printf("tmin Before: %d\n", tmin);
   tmin--;
   printf("tmin After: %d\n\n", tmin);

   int tmin2 = -2147483648;
   int negativeTmin = -tmin2;
   printf("negative tmin: …
Run Code Online (Sandbox Code Playgroud)

c storage integer min twos-complement

1
推荐指数
1
解决办法
4698
查看次数

如何在 ruby​​ 中将二进制补码转换为十进制?

将二进制补码转换为十进制的最简单方法是什么?例如,如果我通常将“1001”之类的字符串转换为十进制,我会得到一个 9。但我实际上试图得到一个简单的 -7。你们有什么建议?,

ruby binary twos-complement

1
推荐指数
1
解决办法
1113
查看次数

什么是加宽整数运算?

让我们检查AddMultiply作为例子。哪一种可以归类为加宽

假设输入是2 的补码中的有符号字符(即长度为 8 位),除非另有声明。

正数加法

1+2 = 3
Run Code Online (Sandbox Code Playgroud)

这个操作似乎没有扩大。1、2 和 3 都适合一个字符。

但是,250 + 6溢出无符号字符。那么这是在扩大吗?

同样可以用有符号类型完成,将有符号125 + 5字符溢出到符号位中。这是在扩大吗?

负数加法

-2-3 = -5
Run Code Online (Sandbox Code Playgroud)

这会使二进制字符溢出 1 位:

   1 1 1 1 1 1 1 0
+  1 1 1 1 1 1 0 1
------------------ 
 1 1 1 1 1 1 0 1 1 
Run Code Online (Sandbox Code Playgroud)

溢出通常会被丢弃,但是,这是否被视为扩大操作?

正数乘法

1 * 2 = 2
Run Code Online (Sandbox Code Playgroud)

即使结果仍然适合原始数据类型,所有乘法是否都在扩大?

上面的例子2仍然适合一个 8 位字符,但是,如果我用二进制手工进行数学运算,额外的0s会附加到结果的左侧,结果被丢弃。 …

assembly cpu-architecture twos-complement integer-arithmetic

1
推荐指数
1
解决办法
78
查看次数

如何在 C 中执行无分支条件算术运算?

我有一个值int x,我想有条件地添加(例如)一个值int y,具体取决于bool c. 我可以写这样的代码:

bool c;    // C23, or stdbool.h macro for _Bool.  Converts to integer 0 or 1
int x, y;  // x could be a global or something

...

if (c)
    x += y;
Run Code Online (Sandbox Code Playgroud)

如果没有分支我怎么能写这个?

ifx是一个没有其他线程可以引用的局部变量,如果编译器认为这样更有效,则可以将 if 转换为无分支。(特别是在自动向量化的情况下,但也适用于标量。)但这对于全局变量来说不是线程安全的,或者如果x实际上是*x带有int *. 编译器无法发明类似于*x += 0抽象机不读取或写入的可能共享对象的写入,这可能会引入数据竞争并影响其他线程存储的值。

c bit-manipulation micro-optimization twos-complement branchless

1
推荐指数
1
解决办法
205
查看次数

二进制补码二进制形式

在TC++编译器中,5的二进制表示是(00000000000000101).我知道负数存储为2的补码,因此二进制的-5(111111111111011).最高位(符号位)为1,表示它是负数.

那么编译器如何知道它是-5?如果我们将上面给出的二进制值(111111111111011)解释为无符号数,它会变得完全不同吗?

另外,为什么1的恭维5 -6(1111111111111010)

c++ binary twos-complement

0
推荐指数
2
解决办法
1万
查看次数

什么是2的补充数?

什么是2的补充数?
为什么我们采用1的补语并加1?为什么我们在服用1次补体后不减1?
为什么计算机使用2的补码?

language-agnostic math numbers twos-complement number-systems

0
推荐指数
1
解决办法
1276
查看次数

〜和 - Javascript运算符问题

我正在尝试编写一个将输入转换为二进制的程序,以及这种输入的一个和两个补码.我相信〜应该翻转位 - 并且应该做同样的事情并加上1合1的值,但结果并不像预期的那样.

<!DOCTYPE html>
<html>
    <head>
        <script>
            function doStuff(){
                var numConv = document.getElementById("origNumber").value;  
                var aNumber = Number(numConv); 
                if (aNumber < 0  || aNumber > 255) 
                    alert("Please enter a number between 0 and 255.");
                else 
                    document.getElementById("binary").innerHTML = aNumber.toString(2); 
                    document.getElementById("ones").innerHTML = (~aNumber).toString(2); 
                    document.getElementById("twos").innerHTML = (-aNumber).toString(2); 


            }
        </script>
    </head>
    <body>
        <input type="text" id="origNumber" />
        <button onclick = "doStuff()">Click Me</button>

       <p>Unsigned Binary:</p> 
       <p id="binary">The binary translation will appear here.</p> <!-- Where the binary appears -->

       <p> One's Complement:</p>
       <p id="ones">The one's complement will …
Run Code Online (Sandbox Code Playgroud)

javascript bitwise-operators twos-complement ones-complement

0
推荐指数
1
解决办法
41
查看次数

内存表示与C中变量值之间的关系是什么?

在C中,确实如此:

[8-bit] signed char: -127 to 127
[8-bit] unsigned char: 0 to 255
Run Code Online (Sandbox Code Playgroud)

但是在记忆中真的发生了什么?是一个带有二进制补码的带符号的char和一个没有任何特定表示的无符号字符(即11111111的序列)?

可执行文件如何跟踪它正在读取的变量类型,以确定CPU寄存器中的值是否被解释为两个补码?是否有一些元数据将变量名称与其类型相关联?

谢谢!

c twos-complement

0
推荐指数
1
解决办法
108
查看次数