数据的存储2

1:计算的时候 内存存的是补码

2:无符号数和有符号数相加 结果自动转化成无符号数 一定是非负数

3:i =-20 ; j= -10; i+j不能直接用-20+10计算 需要转化成二进制存储后进行运算 因为涉及到一个类型的问题

4:以下输出结果是什么

int main()

{

unsigned int i ;

for(i = 9;i >=0; i--)

{

printf("%u\n",i);

}

}

步骤:i是个无符号类型 站在无符号的角度 它不可能有负数的 不可能有负数的话 最小值就是0 对于无符号数它最小值是0 那它恒大于等于0 这个判断条件 恰巧是i>=0 所以恒成立 恒成立这个代码就死循环了

unsigned int这个类型 当你去定义i的时候 只是说站在i的角度 里面是无符号数 而i放在打印的时候  i又说的不算了 i只是一块内存区域 我们在打印的时候 如果写成%u内存里确实是无符号数 如果写成%d 即使i是无符号数 我也认为内存里存的是有符号数数字

5:以下代码输出什么

int main()

{

char a[1000];

int i;

for(i=0;i < 1000; i++)

{

a[i] = -1 - i;

}

printf("%d",strlen(a));

return 0;

}

思路:第一行 定义一个数组 a 能存1000个数

第二行 定义一个i 四个字节

第三行 i赋值0 判断 0<1000;进入下一行代码

第四行:a[0] = -1 - 0; 返回到for循环

i++ 变成i = 1;判断1<1000;进入循环体 a[1] = - 1- 1;执行++

char类型的取值范围是-128~127

从a[0]=-1 到a[127] =-128

a[1] = -2

-1~-128是128个

127~1是127个

所以加一起是255个

strlen是遇0就结尾了 0还不算个数

然后 a[128] = -1 - 128 = 127

a[129] = 126

为什么不是-129 因为在char类型里面 存不上-129 到-128后自动转变为 127

-129如果用最少的bit位 也得是9位 而char类型最多能存8位

strlen是找\0 也就是找0为统计个数的结尾  这样 实际上统计了 -1~-128 和-128~0的这些数的个数 一共是255个

巧记口诀:超出范围的数 如果是正数 则减去256 超出范围的数如果是负数 则加上256

6:strlen()是遇0结尾 0不算个数 如果想计算带0的 得用sizeof总体积除以第一个体积 得个数

为什么 strlen(arr1)得到的结果是 1呢

strlen寻找的时候是按照存在内存里每一个字节去寻找\0 第一个数1 存在内存里是 01 00 00 00 是小端 所以当寻找到第一个字节 01 后 遇到第二个字节 00 就是遇到了\0 所以strlen就不往后计算了 就是1 strlen(arr1) 为什么不是4字节4字节来看呢 汪汪说 strlen不知道你给他的是不是字符数组,但是不管你给他什么,他都是一个字节一个字节走 strlen函数实现的时候定义一个字符指针char *p,定义一个count。从第一次字符开始走,。每次p++因为盘、是字符指针,都走1字节,然后count+1

为什么sizeof(arr2)得到的结果是5呢

因为love是字符串类型 默认后面跟着个\0 \0在sizeof操作符中 也算作一个体积 所以是5

为什么 strlen(arr2)得到的结果是4呢

strlen计算的是 \0前面的个数 \0不算个数 字符串末尾默认跟个\0 所以strlen计算结果是7:字符串就是存ascii码值

8:以下代码输出什么

int main()

{

unsigned int i;

for(i = 9;i >= 0; i--)

{

 printf("%u\n",i);

}

return 0;

}   无限死循环

9:以下代码输出什么

unsigned char i = 0;

int main()

{

for (i = 0; i <=255; i++)

{

 printf("hello world\n");

}

return 0;

}

思路:因为unsigned char取值范围是0-255  最小是0 最大是255  而for循环的判断条件是i <=255 所以恒成立 这样就死循环了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值