从零开始的嵌入式生活:c语言中整数的储存及数据溢出

一、整数存储

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值