内存中的变量

好久没写东西了,好吧,前段时间看了Stanford University的两段公开课视频,老外讲课确实比中国的应试授课有意思多了。

好了,切入正题:

我们都知道,在C语言中 变量在内存中都是以二进制的形式进行存储的;

我们来做一个假设:

    char 1Byte   --内存中存储字符的assii码

   short 2Bytes

    int 4Bytes

  • example1:

char ch = 65;
short s = ch;
我们打印出s,将8bit的内存复制到16bit的内存,直接将ch的8bit放到s的低8bit,所以结果没问题
  • example2:
short s = 0x5001;
char ch = s;
这时 打印出ch,结果就有问题了
因为 ch的8bit明显不足以容纳sd 16bit, 这时直接无视s的高8bit,将s的低8bit复制到ch的8bit中,所以打印出的s是0x01(0x50被无视掉了)

  • example3
short s = 7;
int i = s;
32bit的i容纳16bit的s绰绰有余,此时打印出i 结果正如我们所期待的7(将s的内容放到i的低16位)

但如果是负数呢,是怎么完成的?

short s = -7;
int i = s;
我们知道打印出i 答案必然是-7,但在内存中是真么完成的呢?
我们都知道负数在内存中是以补码形式存储的,-7的补码是:11110001
如果想上面所说,直接把补码搬到i的低16bit,那么符号丢了,显然结果也不是我们所期待的。
其实前面没说,我们多出来的空余位置会填充符号位,前面的整数显然是填0,负数填符号位1,
那么,复制后的i的bit位为: 1111 1111 1111 1111 1111 1111 1111 0001 (红色部分即为填充的符号位)
当然这是补码,变回原码则是(按位取反 加1):1000 0000 0000 0000 0000 0000 0000 1111  = -7

还有关于浮点数的例子,有空了再补上吧。

















   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值