我在 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) 用户输入一个 8 个字符的字符串,然后将其转换为字符串并放入要播放的数组中。
有了这 8 位数字,我希望能够将它们转换为 32 位二进制,例如
整数 = 12,345,678
整数 = -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 来组成 …
所以我使用 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) 将二进制补码转换为十进制的最简单方法是什么?例如,如果我通常将“1001”之类的字符串转换为十进制,我会得到一个 9。但我实际上试图得到一个简单的 -7。你们有什么建议?,
让我们检查Add并Multiply作为例子。哪一种可以归类为加宽?
假设输入是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
我有一个值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
在TC++编译器中,5的二进制表示是(00000000000000101).我知道负数存储为2的补码,因此二进制的-5是(111111111111011).最高位(符号位)为1,表示它是负数.
那么编译器如何知道它是-5?如果我们将上面给出的二进制值(111111111111011)解释为无符号数,它会变得完全不同吗?
另外,为什么1的恭维5 -6(1111111111111010)?
什么是2的补充数?
为什么我们采用1的补语并加1?为什么我们在服用1次补体后不减1?
为什么计算机使用2的补码?
language-agnostic math numbers twos-complement number-systems
我正在尝试编写一个将输入转换为二进制的程序,以及这种输入的一个和两个补码.我相信〜应该翻转位 - 并且应该做同样的事情并加上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
在C中,确实如此:
[8-bit] signed char: -127 to 127
[8-bit] unsigned char: 0 to 255
Run Code Online (Sandbox Code Playgroud)
但是在记忆中真的发生了什么?是一个带有二进制补码的带符号的char和一个没有任何特定表示的无符号字符(即11111111的序列)?
可执行文件如何跟踪它正在读取的变量类型,以确定CPU寄存器中的值是否被解释为两个补码?是否有一些元数据将变量名称与其类型相关联?
谢谢!