内存如何存储有符号和无符号字符

ALe*_*evy 3 c assembly unsigned signed char

刚开始学C,感觉有点迷茫。

我有一些问题:

  1. 如果我有以下代码:
signed  char x = 56;
// ?In the RAM, I will see 00111000? yes/no?

signed char z = -56;
// In the RAM, I will see 11001000 yes/no?

unsigned char y = 200;
// ?In the RAM, I will see 11001000? yes/no?
Run Code Online (Sandbox Code Playgroud)
  1. 我有以下代码:
if (z<0){
   printf("0 is bigger then z ");
}
Run Code Online (Sandbox Code Playgroud)

编译后,汇编指令如何知道z是-56而不是200?(有符号和无符号的特殊ASM指令?)。

正如我在问题 1 中提到的,z 和 y 的值是 11001000,并且没有任何指示知道它是有符号还是无符号。

如果我没有找到正确的提问方式,请原谅,希望你理解我 谢谢

Ale*_*iev 5

数字以二进制形式存储。负数通常以二进制补码形式存储,但 C 语言允许不同的表示形式。所以这个:

signed char z = -56;
// In the RAM, I will see 11001000 yes/no?
Run Code Online (Sandbox Code Playgroud)

通常是的,但可能不在一些异国情调的平台上。

第二个问题太具体了。例如,在 x86 上与零的比较可以作为自比较执行,并且flags寄存器会受到影响,因为无符号比较标志标志 ( SF) 被忽略。