数据溢出(C语言)

2 篇文章 0 订阅

数据以二进制的形式存储在内存中。
1、正数储存

unsigned char a = 256;
printf("a = %d\n",a);

以上代码输出结果为:a = 0
原因:256的二进制形式为:1 0000 0000
而字符型变量在内存中占一个字节。
所以a储存在内存时是0000 0000,故输出为0

2、负数储存
相关概念
①源码、反码、补码
以200为例
源码:1100 1000(200的二进制形式)
反码:0011 0111(源码取反)
补码:0011 1000(反码加一)
②unsigned char 与 char 的区别
unsigned char 是无符号字符型,范围:0~255
char 是有符号字符型,范围:-128~127(最高位代表符号 0为正1为负)
③负数在内存中以补码形式储存

char a = 200;
printf("a = %d\n",a);

此时a对应的内存空间储存的是1100 1000,最高位代表为负数,不参与运算
当读数据时,电脑会将a还原成源码,即此时
补码:100 1000
反码:100 0111
源码:011 1000 (十进制为56)
所以读出来的数据为1011 1000,最高位代表正负(1负0正)
所以程序输出的是a = -56

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值