深入理解c语言——char的范围为什么是-128到127而不是-127到127

 对于多数编译器而言(包括VC++),char 都视作 signed char来处理,这时 char 的取值范围得与二进制编码技术有关,对于补码表示法。char 的取值范围是 -128 - 127, 对于符号绝对值编码法、反码记法, char 的取值范围是 -127 - 127。char 有 8 位,最高位是符号位,所以 char可以在 -127 - 127 取值是没有疑问了。
当最高位是 1,其余位都是 0 时,按照补码表示法的规则,这个数应该是 负数了,用求负数的二进制的方法反推回去:
      二进制:      1000 0000
        减一:                0111 1111
          逐位取反:    1000 0000          //和原来的二进制形式一样,对应正整数 128
  经过这一系列操作之后,二进制形式依然是 1000 0000,对应 数值 128,但这个数是负数,因为反推前 最高位是 1 的,故对应 -128。
其他的整数类型 short 、int 、long 也可以这样推导。

 

我们的机器多数是基于补码表示的

11111111   =   -1
10000000   =   -128

现在证明   10000000   表示的是   -128而不是-0
10000000   +   00000001   =   10000001   =   -127

显然   -128   +   1   =   -127
11111111   符号位为1表示负数

将数值位按位取反加一得到
0000000+1   =   0000001

所以   11111111   =   -1

<think>好的,用户之前问过如何学习算法,作为一个新手,现在他补充说想用C语言不是Python,需要学到什么程度。我需要先理解他的需求和背景。可能他之前得到的学习路径是建议Python,但他现在可能有特殊需求,比如学校课程、项目要求或者对C语言感兴趣。 首先,我需要明确学习算法用C语言的不同之处。C语言相比Python更底层,需要手动管理内存,语法更严格,但能更好地理解数据结构在内存中的表示。用户作为小白,可能对C的难度不太清楚,需要给出具体的学习建议,避免他半途而废。 接下来,我得确定用户需要学到什么程度。学习算法的话,不需要掌握C的所有高级特性,但必须掌握基础语法、指针、结构体、动态内存分配这些关键点。比如,指针在数据结构中非常重要,链表、树等结构都需要用到。同时,动态内存管理是必须的,因为很多数据结构需要在运行时分配内存。 然后,用户可能需要资源推荐,特别是针对C语言的数据结构和算法。需要列出一些经典书籍,比如《C Primer Plus》打基础,《数据结构与算法分析——C语言描述》作为进阶。同时,推荐实践方法,比如如何从数组和结构体开始,逐步构建链表、栈、队列,再过渡到更复杂的结构。 还要注意用户可能的误区,比如指针理解困难,或者内存泄漏问题。需要提醒他重视调试和动手实践,因为C语言更容易出现这些问题,而这对于算法实现来说是基础。 另外,用户可能担心C语言的学习曲线陡峭,所以需要鼓励他,指出虽然C更难,但对理解底层有帮助,坚持下去会有更深的理解。同时,建议分阶段学习,先掌握基础,再逐步深入数据结构,最后结合算法题目练习。 最后,总结学习路径,强调每一步的关键点,并给予鼓励,帮助他保持动力。需要确认回答是否覆盖了C语言的关键知识点,以及如何与算法学习相结合,确保用户能够明确学习目标和步骤。</think>如果你想用 **C语言** 学习算法(而不是Python),需要掌握以下核心知识点和编程能力。C语言相比Python更底层,需要更关注内存管理和数据结构的手动实现,但这也让你更深入理解算法的底层逻辑。以下是具体的学习目标和建议: --- ### **1. C语言需要掌握的程度** #### **基础语法** - **必须熟练**: - 变量、数据类型(`int`, `float`, `char`, 数组) - 流程控制(`if-else`, `for`, `while`, `switch`) - 函数定义和调用(参数传递、返回值) - 指针的基本操作(指针定义、取地址`&`、解引用`*`) - 结构体(`struct`)的定义和使用 - 动态内存管理(`malloc`, `free`,避免内存泄漏) - **需要理解**: - 指针与数组的关系(如数组名是指针常量) - 字符串操作(`strcpy`, `strcmp`等函数,注意结尾的`\0`) - 文件读写(`fopen`, `fread`, `fwrite`,算法题中较少用,但实际项目可能涉及) --- #### **重点难点** - **指针的深入理解**: 指针是C语言的核心,算法中大量使用指针操作数据结构(如链表、树)。需要掌握: - 指针的指针(如`int**`用于动态二维数组) - 函数指针(高阶用法,初期可暂缓) - **动态内存分配**: 算法中常用动态内存构建灵活的数据结构(如链表、二叉树),必须掌握: - `malloc`和`free`的配对使用 - 避免“野指针”和“内存泄漏” --- ### **2. 如何结合C语言学习算法?** #### **阶段一:用C实现基础数据结构** 1. **数组与字符串** - 实现数组的增删改查 - 练习字符串反转、子串查找等基础算法 2. **结构体与链表** - 手写单链表/双链表(插入、删除、反转) - 示例代码框架: ```c typedef struct Node { int data; struct Node* next; } Node; Node* create_node(int data) { Node* new_node = (Node*)malloc(sizeof(Node)); new_node->data = data; new_node->next = NULL; return new_node; } ``` 3. **栈与队列** - 用数组实现静态栈/队列 - 用链表实现动态栈/队列 4. **树与图** - 二叉树的结构体定义与遍历(递归实现) - 图的邻接表表示(结构体嵌套指针) --- #### **阶段二:用C实现经典算法** 1. **排序算法** - 实现冒泡排序、快速排序(注意指针操作) - 示例:快速排序的分区函数 ```c int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] < pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return i + 1; } ``` 2. **递归与分治** - 用递归实现斐波那契数列、汉诺塔 - 注意C语言的递归栈深度限制(可能溢出) 3. **动态规划** - 用数组实现背包问题、最长公共子序列 - 注意C中二维动态数组的创建: ```c int** dp = (int**)malloc(rows * sizeof(int*)); for (int i = 0; i < rows; i++) { dp[i] = (int*)malloc(cols * sizeof(int)); } ``` --- ### **3. 学习资源推荐** - **书籍** - 《C Primer Plus》:适合零基础系统学习C语言 - 《数据结构与算法分析——C语言描述》:经典教材,代码示例丰富 - 《C和指针》:深入理解指针的必读书 - **实战练习** - **LeetCode**:支持C语言提交,选择“简单”难度题目(如[两数之和](https://leetcode.cn/problems/two-sum/)) - **PTA(程序设计类实验辅助教学平台)**:国内高校题库,适合练习基础语法和算法 --- ### **4. 注意事项** 1. **重视调试**: C语言没有Python的易用性,需学会用`printf`调试或工具(如GDB)。 2. **避免指针错误**: - 初始化指针时赋值为`NULL` - 释放内存后立即将指针置`NULL` 3. **从简单到复杂**: 先实现线性结构(如链表),再逐步挑战树、图等复杂结构。 --- ### **总结:C语言学算法的优势与挑战** - **优势**:深入理解内存管理、提升代码效率意识。 - **挑战**:需要更多代码量实现相同功能,但坚持下来会对计算机系统有更深理解。 建议学习路线: **C基础语法 → 指针与结构体 → 动态内存管理 → 手写数据结构 → 实现经典算法 → 刷题巩固** 坚持动手写代码,即使一个链表调试半天也是宝贵经验! 🚀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值