ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

2026十月C语言学习记录1

2026十月C语言学习记录1 **2026十月C语言学习记录16.2.1数据类型和sizeof的用法 6.2.2除int之外的其他类型先补充一些前提知识同时也是“6.2.3 整数在计算机是如何表达”的内容6.2.1 数据类型与 sizeof 6.2.2除int外的其他数据类型1. C语言有哪些基础数据类型C语言是强类型语言变量必须先声明类型。我们写段代码用sizeof看看它们各自占多大内存。#includestdio.hintmain(){// 用 sizeof 查基础类型的大小printf( 1. 基础类型大小 \n);printf(char: %d 字节\n,sizeof(char));printf(short: %d 字节\n,sizeof(short));printf(int: %d 字节\n,sizeof(int));printf(long: %d 字节\n,sizeof(long));printf(float: %d 字节\n,sizeof(float));printf(double: %d 字节\n,sizeof(double));return0;}代码解释整型家族主要分char1字节、short2字节、int4字节、long在32位系统是4字节64位系统是8字节。浮点数家族有float4字节单精度和double8字节双精度。你运行后会发现在 DevC32位/64位 PC下和在 STM3232位单片机下int和float都是 4 字节这是最常见的数据宽度。2. sizeof 不仅可以量类型还可以量变量inta10;doubleb3.14;printf(\n 2. 变量的大小 \n);printf(变量 a 的大小: %d 字节\n,sizeof(a));// 相当于 sizeof(int)printf(变量 b 的大小: %d 字节\n,sizeof(b));// 相当于 sizeof(double)代码解释sizeof是C语言里的一个单目运算符不是函数。用法很灵活既可以写sizeof(int)也可以写sizeof(变量名)算出来的结果是一回事。它的计算单位是字节。3. 【超级易错点】sizeof 在编译时求值不执行里面的表达式这是考试和面试最爱考的一个坑看代码inti10;intsizesizeof(i);printf(\n 3. 易错点测试 \n);printf(sizeof(i) 结果: %d\n,size);printf(执行完这行后i 的值: %d\n,i);代码解释运行结果size的值是4而i的值依然是 10不是 11为什么因为sizeof在程序编译阶段就已经算出了i占 4 个字节i这个表达式根本不会在程序运行时执行。这是初学者极易踩的坑记住sizeof 的括号里只求类型不搞计算。4. 小结翁恺原话精髓不同数据类型占用内存不同有符号signed和无符号unsigned的取值范围也不同。写代码时要养成用sizeof看类型大小的习惯知道你的变量到底占了多少字节这对后续理解内存和指针至关重要。STM32关联以后写STM32直接敲uint8_t、uint32_t占几个字节不用猜代码移植也不会出错。这一节的核心就一句话计算机用有限的二进制位存数字最高位决定正负由此推算出最大最小值。6.2.4 整数的范围如何推算整数类型的所能表达的数的范围溢出了怎么办这一节的核心就一句话计算机用有限的二进制位存数字最高位决定正负由此推算出最大最小值。1. 先看代码感受“溢出”是什么#includestdio.hintmain(){charc127;// char 能存的最大正数cc1;// 加1超出范围printf(char 127 1 %d\n,c);unsignedcharuc255;// 无符号 char 的最大值ucuc1;printf(unsigned char 255 1 %d\n,uc);return0;}代码解释运行结果char 127 1 -128unsigned char 255 1 0。这就是“溢出”。127 的二进制是01111111加1变成10000000。最高位变成1了被计算机当成负数补码也就是 -128。无符号的 255 是11111111加1直接变成100000000超出的1被丢掉剩下00000000结果是 0。2. 如何推算范围公式推导一个类型占n个字节就是8n个二进制位bit。无符号unsigned没有符号位所有位都用来存数值。最小值全0即0。最大值全1即2^(8n) - 1。例如unsigned char1字节范围0 ~ 2^8-1 0 ~ 255。有符号signed最高位被拿去做符号位0正1负剩下8n-1位存数值。最大值最高位0后面全1即2^(8n-1) - 1。最小值最高位1后面全0。因为计算机用补码所以对应的是-2^(8n-1)。例如char1字节范围-2^7 ~ 2^7-1 -128 ~ 127。3. 用代码验证类型的极限值C语言在limits.h头文件中定义了各种类型的极值宏。#includestdio.h#includelimits.hintmain(){printf( 有符号 char \n);printf(最小值: %d\n,CHAR_MIN);printf(最大值: %d\n,CHAR_MAX);printf(\n 无符号 char \n);printf(最小值: %d\n,0);printf(最大值: %d\n,UCHAR_MAX);printf(\n int 类型 \n);printf(最小值: %d\n,INT_MIN);printf(最大值: %d\n,INT_MAX);return0;}代码解释输出结果会显示CHAR_MIN是 -128CHAR_MAX是 127UCHAR_MAX是 255。INT_MIN是 -2147483648INT_MAX是 2147483647。你可以把CHAR替换成SHRTshort、INT、LONGlong来查其他类型。4. 【易错点】printf 用%d打印无符号数会出问题unsignedintu4294967295;// 无符号 int 的最大值printf(用 %%d 打印: %d\n,u);// 结果是 -1printf(用 %%u 打印: %u\n,u);// 结果是 4294967295代码解释同样是 4 个字节的11111111 11111111 11111111 11111111用%d有符号打印最高位是1计算机认为这是补码算出是 -1。用%u无符号打印最高位也当数值算出是 4294967295。这也是为什么你在开发时如果看到一个大正数打印出来是负数肯定就是数据类型的符号搞错了。小结推算口诀n 个字节 8n 个二进制位。无符号0到2^(8n) - 1。有符号-2^(8n-1)到2^(8n-1) - 1。最高位是符号位存负数用补码。STM32关联ADC采集电压值用uint16_t刚刚好因为单片机ADC是12位的最大也就4095用无符号类型刚好合适用有符号反而给自己找麻烦。
返回列表