【C语言】【补码】经典例题

转自《c语言深度解剖》

我们知道计算机底层只认识 01.任何数据到了底层都会变计算转换成 01.那负数怎么 存储呢?肯定这个“-”号是无法存入内存的,怎么办?

很好办,做个标记。把基本数据类型的最高位腾出来,用来存符号,同时约定如下:最高位如果是 1,表明这个数是负数,其 值为除最高位以外的剩余位的值添上这个“-”号;如果最高位是 0,表明这个数是正数, 其值为除最高位以外的剩余位的值。

这样的话,一个 32 位的 signed int 类型整数其值表示法范围为: - 2的31次方 2的31次方   -1 8 位的
char 类型数其值表示的范围为 - 2的7次方   2的7次方   -1
一个 32 位的 unsigned int 类型整数其值表示法范围为:0 2的32次方   -1 8 位的 char 类型数其值表示的范围为 0 2的8次方   -1。

可以看成一个循环。

#include <stdio.h>
#include <string.h>

int main() {
    char a[1000];
    int i;
    for (i = 0; i < 1000; ++i) {
        a[i] = -1 - i;
    }
    printf("%d", strlen(a));
    return 0;
}

数组从 -1 到 -128 再到 127 到 1,然后到 0,字符串结束标记,所以有效长度为 128 + 127 = 255 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值