1.原码、补码
2.计算机寄存器和内存进行运算的存储方式
int main(){
unsigned char a = 255;
char b = 255;
printf("%d %un",a,a);
printf("%d %un",b,b);
return 0;
}
输出结果:
255 255
-1 4294967295
解析:
a是一个无符号字符型数据,且a是一个正数,正数的补码即为原码。在存入寄存器中时高位补0,即0000 0000 0000 0000 0000 0000 1111 1111(32位)。再到CPU中进行运算,之后存入寄存器中,值不变。%d是以补码还原的形式输出,%u是直接以十进制输出。故前者输出的值为255,255。
b是一个有符号字符型数据,且b是一个正数,正数的补码即为原码。在存入寄存器中时高位补符号位,因为1111 1111的最高位为符号位,符号位为1,故前面都补1,即1111 1111 1111 1111 1111 1111 1111 1111。输出时%d补码还原,负数的补码为原码取反+1,得到0000 0000 0000 0000 0000 0000 0000 0001,故为-1。%u以十进制输出,故得到2^32-1。
char c = 250;
unsigned char d;
char f;
d = c + 249;
f = c + 249;
printf("d=%dn",d);
printf("d=%un",d);
printf("f=%dn",f);
printf("f=%un",f);
输出:
d=243
d=243
f=-13
f=4294967283
解析:
250的补码为1111 1010,250为正数且为char型,不足32位,故高位补符号位,存入寄存器中的补码为1111 1111 1111 1111 1111 1111 1111 1010,249为正数且为int型(32位),存入寄存器的补码为0000 0000 0000 0000 0000 0000 1111 1001,两者相加得:0000 0000 0000 0000 0000 0000 1111 0011,虽有溢出,但溢出的部分全部丢失,因d和f都为char型,故截取低八位,即1111 0011。运算是在内存中进行的,打印是在寄存器中进行。d为无符号,存入寄存器中高位补0;f为有符号,高位补符号位。
unsigned char a = -196;
unsigned char b = 14;
char c = -196;
char d = 14;
printf("%dn",a+d);
printf("%dn",c+b);
输出:
74
74
解析:
无符号·char的范围为0 ~ 255,有符号的为-128 ~ 127。因为196溢出,-196的补码为0011 1100(60的原码),14的补码为0000 1110;无论-196为unsigned还是signed,高位都补0(signed-196的符号为0);因为char和unsigned char要转为int和unsigned int类型(低位转高位);-196的补码为0000 0000 0000 0000 0000 0000 0011 1100(32位),14的补码为0000 0000 0000 0000 0000 0000 0000 1110,两者相加得:0000 0000 0000 0000 0000 0000 0100 1010,即74。
unsigned char a = -123;
unsigned char b = 14;
char c = -123;
char d = 14;
printf("%dn",a+d);
printf("%dn",b+c);
输出:
147
-109
解析:
-123的补码为1000 0101,转为int型的补码为1111 1111 1111 1111 1111 1111 1000 0101(有符号),或0000 0000 0000 0000 0000 0000 1000 0101(无符号),与14相加得1111 1111 1111 1111 1111 1111 1001 0011(b+c),或0000 0000 0000 0000 0000 0000 1001 0011(a+d)。故a+d的结果为147,b+c的结果为-109。
unsigned int a = -10;
if(a>10)
printf("yesn");
else
printf("non");
输出:
yes
解析:a为无符号数且a为负数,-10的补码为1111 1111 1111 1111 1111 1111 1111 0110(int为32位),转化为10进制数为2^32-10,显然大于10。
本文发布于:2024-01-29 11:28:11,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170649889314949.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |