一、整数存储
c语言中存在 有符号变量和无符号变量两种情况
有符号变量
signed int a = 123; //有符号数
int b =123; //有符号在定义时关键词是可以省略的
a = -123;
b = -123;
无符号变量
unsigned int a = 123; //无符号数, unsigned关键字是不能忽略
a = -123; //不正确
a = 0; //正确
有符号变量的最高位为符号位(0:正数,1:负数)
这就意味着同一个数据类型有符号和无符号取值范围并不一样
例如 char 取值范围为-128~+127,而unsigned char的取值范围为 0~255
原码
将一个整数转换成二进制形式,就是其原码
例如short a = 6;,a 的原码就是0000 0000 0000 0110
更改 a 的值a = -18;,此时 a 的原码就是1000 0000 0001 0010
正数与负数的原码区别在于符号位
反码
对于正数,它的反码就是其原码(原码和反码相同)
例如short a = 6; a 的原码和反码都是0000 0000 0000 0110;
负数的反码是将原码中除符号位以外的所有位(数值位)取反也就是 0 变成 1,1 变成 0
更改 a 的值a = -18; 此时 a 的反码是1111 1111 1110 1101
补码
对于正数,它的补码就是其原码(原码、反码、补码都相同);
例如short a = 6; a 的原码、反码、补码都是0000 0000 0000 0110;
负数的补码是其反码加 1。
更改 a 的值a = -18 此时 a 的补码是1111 1111 1110 1110 = 1111 1111 1110 1101(负数反码)+ 1
在计算机中整数一律采用补码来存储,读取整数时再经过逆向操作得到原来的数据。
二、数据溢出
short、int、long 是C语言中常用的三种整数类型,分别称为短整型、整型、长整型。
在现代操作系统中,short、int、long 的长度分别是 2、4、4 或者 8,它们只能存储有限的数值,当数值过大或者过小时,超出的部分会被直接截掉,数值就不能正确存储了,我们将这种现象称为溢出(Overflow)
比如short的长度为2 所以short最大值为 0111 1111 =+127 最小值为 1111 1111 =-128;
所以如果你给short定义的值不在-128~=127之内的话就会出现数据溢出现象
意味着实际存储入计算机的数并不是你输入的那个数据
无符号数据溢出
比如:
#include <stdio.h>
int main(void)
{
unsigned char ch = 256; //取值范围0~255
printf("ch:%d\n", ch);
return 0;
}
256显然已经超过了0~255的范围这时就发生了数据溢出
那么数据溢出有什么规律呢? 我们能不能算出此时ch存储的值?
在计算机中无符号的char 存储是 0~255 就是说
那么结果显而易见 存储的数据为0
有符号数据溢出
在计算机中有符号的char 存储是 0~+127-128~0 就是说
例如:
char ch = 120;
ch = ch + 36;
那么结果显而易见 存储的数据为-100