#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
char i = -128;
int j = i;
printf("%d %u\n", j, j);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是 -128 4294967168
我的想法是什么
i: 10000000
Run Code Online (Sandbox Code Playgroud)
在赋值运算符之后,执行符号扩展
j: 11111111 11111111 11111111 10000000
Run Code Online (Sandbox Code Playgroud)
我想问的是如何printf("%d",j)知道打印-128只是使用
最后一个字节?这个怎么运作?
谢谢!
我想问的是printf("%d",j)如何知道打印-128只使用最后一个字节?
它没有.它被告知打印一个有符号的int,因此它从堆栈中获取适当的字节数 - 典型地为4 - 并将该位模式解释为有符号int.
当您char为int变量赋值为负数时,如此int j = i;处所示,实际上并不是符号扩展,但是 - 因为所有char可以表示的值也可以表示为int- 保值转换,所以char i转换为int具有相同的值值.
在目前最常见的两个补码机器上,以及在补码中,保值转换恰好与符号扩展一致,但如果表示是符号和幅度,则转换将是不同的.
由于-128不能表示为有符号的8位整数,只有1的补码或符号和幅度,让我们看一下当将-127转换为32位有符号整数时,位模式会发生什么变化.表示:
两个补码:
10000001 -> 11111111 11111111 11111111 10000001
Run Code Online (Sandbox Code Playgroud)
一个补充:
10000000 -> 11111111 11111111 11111111 10000000
Run Code Online (Sandbox Code Playgroud)
登录和幅度:
11111111 -> 10000000 00000000 00000000 01111111
Run Code Online (Sandbox Code Playgroud)