unsigned char A =10;
signed char B = -20;
//计算的时候
A = 0x0A;
B = 0xEC;//转换为int计算,C语言的规定
A --> 0x000000 0A;
B --> 0xFFFFFF EC;
A + B = 0xFFFFFF F6;//结果是int型的
//用其它类型 接收,相应的转换就是
推荐看看这篇博客 C语言中无符号数和有符号数之间的运算
cpu内部用标志位来区分有无符号 一个数值在cpu内部都是二进制表示同时代表两个值
计算的结果类型会是int或者float。
在执行运算时,编译器会要求将数据类型统一,也就是强制转换成相同切精度增加或不变的数据类型。例如:对于int 和unsigned int, 处理器会将后者转换为前者,再进行加减运算。而当运算可能出现小数时(整数除法),两个数据会被转换成float,然后进行运算,输出float的结果。
1、有符号数:
有符号数是针对二进制来讲的。用最高位作为符号位,“0”代表“+”,“1”代表“-”;其余数位用作数值位,代表数值。有符号数的表示:计算机中的数据用二进制表示,数的符号也只能用0/1表示。一般用最高有效位(MBS)来表示数的符号,正数用0表示,负数用1表示。有符号数的编码方式,常用的是补码,另外还有原码和反码等。用不同二进制编码方式表示有符号数时,所得到的机器数可能不一样,但是真值应该是相同的。
2、无符号数:
无符号数的表数范围是非负数。全部二进制均代表数值,没有符号位。即第一个"0"或"1"不表示正负。无符号数与有符号数相对C支持所有整形数据类型的有符号数和无符号数运算。尽管C标准并没有指定某种有符号数的表示,但是几乎所有的机器都使用二进制补码。通常,大多数数字默认都使有符号的,C也允许无符号数和有符号数之间的转换,转换原则是基本的位表示保持不变。因此在一台二进制补码机器上,当从无符号数转换为有符号数时,效果就是应用U2Tw,而从有符号转换为无符号数时,就是应用函数T2Uw,其中w表示数据类型的位数。其中:
T2Uw(x) = (x<0)?(x+2w) :x;
U2Rw(x) = (x<2w-1)?x:(x-2w);