2s补码是一种存储负数的方法吗?

Is 2s complement a way to store negative number?

看了很多文章和SO答案才明白2s complement。他们帮了我很多。不过,我心中对2s complement.

的疑惑很少

1) 2s complement 是一种存储负数的方法,以便于操作或者也有一些其他应用吗?

2) 2s complement 是电脑看到负数时自动取?

3) 取 2s complement 是 -- 编译器的工作还是由处理器完成还是什么?

4) 当2s complement是在--编译时,运行时还是在给变量赋值时?

我看的文章是(应该推荐更好理解2s complement):

What is “2's Complement”?

Why is two's complement used to represent negative numbers?

http://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

Is 2s complement a way to store negative numbers in order to make operation easy?

是的,这是一种存储有符号数的方法(负数和正数,不仅仅是负数)

2s complement is taken automatically when computer see a negative number?

再次否定 -> 签名。取决于架构。可以选择 1s、2s 或其他表示形式。

Taking 2s complement is -- compiler's job or done by processor or what?

编译器必须理解系统,处理器可能理解也可能不理解 2s 补码系统。

When 2s complement is taken at -- compile time, run time or at the time of assiging a value to a variable?

2s的补码可能在所有阶段都计算出来(编译,运行)

1) 是的。

2) 计算机不能"see"一个负数。它可以看到一大块二进制数据。您的应用程序拥有说 "this chunk of binary data is an integer stored in 2's compl" 的智能。但是,世界上几乎每个 CPU 都支持 2 的补码算法。

3) 编译器看到int32_t x = 0;这样的源代码,然后意识到这个变量是以二进制补码格式存储的。如果您随后添加 x = x - 1 之类的代码,编译器会在生成您的程序时选择使用支持 2 的补码的处理器指令。处理器只做程序告诉它做的事情。它没有智能。

4) 如上所述,这是一个编译时决定。 (不太确定 "complement taken" 是什么意思...)