1、有符号变量与无符号变量之间的值的转换
程序例子
涉及到的内容是:
有符号变量和无符号变量之间的转换
溢出(如何判断)
#include<stdio.h>
char getchar(int x, int y){
char c;
unsigned int a = x;
(x + y > 10 ) ? (c = 1): (c = 2);
return c;
}
int main(){
char ch1 = getchar(7,4);//x+y = 11 > 10, c=1
char ch2 = getchar(7,3);//x+y = 10 = 10, c=2
char ch3 = getchar(7,-7);// x+y = 0 < 10, c=2
char ch4 = getchar(7,-8);// x+y = -1 < 10, c= 2
print("ch1: ", c1, "\nch2: ", ch2, "\nch3: ", ch3, "\nch4: ", ch4);
}
>>ch1:1
ch2:2
ch3:2
ch4:1 // 与预想的结果不一致
2、有符号变量和无符号变量的区别:
以8位二进制的char为例解释:
1、如果是有符号变量的话则8个数字表示的是-128~127,共计256个数字
2、如果是无符号变量的话则表示0~255,共计256个数字。
3、有符号数字的左边第一个位置表示符号位(0表示正数,1表示负数),无符号变量的左边第一个数字表示2^7 = 128
4、有符号变量中的负数用补码表示,正数与无符号变量一致(这个表示在一个表达式中同时存在有符号变量和无符号变量时需要都转换成无符号变量进行计算,有符号的变量需要从原码转换成补码进行计算)
5、无符号变量用原码表示
6、原码就是如下表格
7、反码在此基础上将符号位除外的其他为反值
8,补码为反码加1
3、对1中的代码11,12行的输出解释
所以上面的11行,12行代码的计算为:
11行
-7:原:1000 0111
反:1111 1000
补:1111 1001
————————
7: 原:0000 0111
————————
= 10000 0000 (有溢出,实际的值为0)
12行
-8:原:1000 1000
反:1111 0111
补:1111 1000
————————
7: 原:0000 0111
————————
= 1111 1111(恰好没有溢出,实际的值为255)
255 > 10 所以
c = 1