【C语言进阶(2)】数据存储练习题

文章目录

练习1

  • 下面代码的结果为什么会是这样?

代码分析

  • char a = -1;
c 复制代码
11111111 11111111 11111111 11111111 //-1 的补码
- 因为 a 是 char 类型的变量,只能存储 8 个比特位,将 -1 补码的后 8 位截断后赋给 a
a = 11111111						//a 里实际存的补码就是这个

- 将 -1 截断给 a 之后,就要准备打印 a 的值了,打印之前需要先判断 a 的类型再对 a 进行整型提升。
- a 是 char 类型,所以 11111111 最高位的 1 为符号位,整型提升高位补 1。
11111111 11111111 11111111 11111111 //变量 a 整型提升后的值

- 最后再对提升后的值以 %d 的形式打印,提升后的值在 %d 眼里是个负数,所以补码需要转成原码再打印。
10000000 00000000 00000000 00000001	//-1 的原码,打印的 -1 就是这么来的
  • signed char b = -1;

    • char 实际上就是 signed char,所以 a 和 b 的存取过程一样,就不多赘述了。
  • unsigned char c = -1;

c 复制代码
11111111 11111111 11111111 11111111 //-1 的补码
c = 11111111						//将 -1 的补码截断赋给 c

- 存好 c 的值之后就要准备打印 c 了,先根据 c 的类型确定整型提升高位补什么
- c 是 unsigned char 类型,所以高补 0.
00000000 00000000 00000000 11111111 //变量 c 中存的值整型提升后的结果

- 对提升后的值以 %d 的形式打印,这个值在 %d 眼里是个正数,所以这个补码就是原码,直接打印即可。
00000000 00000000 00000000 11111111 //打印的 c 的 255 就是这么来的

练习2

c 复制代码
10000000 00000000 00000000 10000000 //-128 的原码
11111111 11111111 11111111 01111111 //-128 的反码
11111111 11111111 11111111 10000000 //-128 的补码
- 将 -128 的补码最后 8 位截断赋给 a = 10000000

- 在打印之前先根据 a 的类型确定整型提升高位补什么,
- a 是 char 类型,为有符号数,a 的符号位为 1,整型提升高位补 1
11111111 11111111 11111111 10000000	//整型提升后 a 的值

- 最后再以 %u 的形式打印,在 %u 眼里没有负数,提升后的值最高位的 1 也不是符号位,就是个普通的 1
11111111 11111111 11111111 10000000	//直接打印提升后的数,42亿就是这么来的

练习3

c 复制代码
10000000 00000000 00000000 10000000 //128 的原反补码
a = 10000000						//截断后 8 位赋给 a

- 打印之前先根据变量类型整型提升,a 为 char,高位补 1
11111111 11111111 11111111 10000000 //提升后的值

-同样的,在 %u 眼里这就是个超大的正数,直接打印即可。		
11111111 11111111 11111111 10000000	//42 亿就是这么来的

练习4

  • 在前面的数据存储那篇博客也说过了,两数相加是两数之间的补码进行相加。
c 复制代码
11111111 11111111 11111111 11101100	//-20 的补码
00000000 00000000 00000000 00001010 // 10 的补码
11111111 11111111 11111111 11110110 //i+j 的补码

- 在 %d 眼里 i+j 的补码是个有符号的负数,所以要转成原码再打印
10000000 00000000 00000000 00001010 //i+j 的原码,打印的 -10 就是这么来的

练习5

  • i 为 unsigned int 类型,也就是说 i 永远不可能小于 0,循环的判断条件就恒成立了。
c 复制代码
- 当 i 的补码自减到 0 的时候
00000000 00000000 00000000 00000000 //此时再对 i 减 1
11111111 11111111 11111111 11111111 //结果就变成这样了,对于无符号数来说,这就是个将近 43 亿的数字

练习6

  • char 的取值范围为 -128 ~ 127 ,之间只能存储 255 个数字;
  • strlen 只会求 \0 之前出现的字符个数,\0 的 ASCII 码值为 0。
  • 从 -1 开始往数组 a 里面存储数据,转完一圈存进去第一个 0 之前,已经存了 255 个字符了,所以结果的 255 就是这么来的。

练习7

  • unsigned char 的取值范围为 0 ~255,i 永远也无法大于 255,判断条件恒成立,自然死循环。
相关推荐
铅笔侠_小龙虾10 小时前
Rust 学习目录
开发语言·学习·rust
云泽80810 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
灯澜忆梦10 小时前
GO---可见性规则
开发语言·golang
逝水无殇10 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
这是个栗子11 小时前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
凤凰院凶涛QAQ11 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
研☆香12 小时前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript
右耳朵猫AI12 小时前
PHP周刊2026W28 | 安全更新、Laravel 13.18、Twig 3.28
开发语言·php·laravel
second6012 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
郝学胜-神的一滴12 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法