C语言:基本数据类型的转换与内存存储

发布时间:2026/5/20 5:16:35

C语言:基本数据类型的转换与内存存储 上篇内容我们已经了解了C语言中一些常用的基本数据类型本文将接着介绍不同数据类型之间的相互转换以及它们转换的本质数据在内存中存储的方式。首先要明确一、内存存储的基础位与字节、原反补规则计算机内存以字节Byte为单位进行寻址1字节 8位bit。每个位只能是0或1因此我们平时用的十进制整数在计算机中以二进制存储。但是当计算机对数据进行操作时要遵循原反补规则。这里读者须记住所有的数据在计算机中的存储均以补码的形式存在在进行数据的相关运算时也是对补码进行操作。那么什么是原反补规则将每一个数字按照符号位和数值位进行展开 这个二进制称为这个数字的原码。正数的原反补码均相同而负数的反码是其原码的符号位数值0或1不变其余位去反得到而负数的补码是其反码1得到的。下面将以代码展示​ #includestdio.h int main(){ int a47;//先将47转化为相应的二进制00101111 //a会申请4个字节将47存储 //原码0 0000000 00000000 00000000 00101111 //反码0 0000000 00000000 00000000 00101111 //补码0 0000000 00000000 00000000 00101111 printf(%d\n,a);//打印时按格式控制符打印原码 int b-47;//先将47转化为相应的二进制00101111 //b的符号位数值位1 //原码1 0000000 00000000 00000000 00101111 //反码1 1111111 11111111 11111111 11010000 //补码1 1111111 11111111 11111111 11010001 printf(%d\n,b);//打印时按格式控制符打印原码 return 0; } ​二、数字在内存中的运算明白了数据在内存中的存储那么数据在进行运算时是如何实现的呢因为乘除运算可以演化看作为相应的加减运算这里就以数据的加减来解释计算机中运算的实现在此之前要强调一下计算机只能进行加法在利用原反补规则后就可以解决负数和正数相加的问题减去一个数就等于加上这个负数的补码。以下是代码的数据运算#includestdio.h int main(){ int a 10; //原0 0000000 00000000 00000000 00001010 //补0 0000000 00000000 00000000 00001010 int b -20; //原1 0000000 00000000 00000000 00010100 //补1 1111111 11111111 11111111 11101100 //计算机在操作数据时使用补码进行加法 结果是它们相加后的补码 打印时结果是原码 int c a b;//10(-20) // 10补0 0000000 00000000 00000000 00001010 // //-20补1 1111111 11111111 11111111 11101100 //结果 : 1 1111111 11111111 11111111 11110110 相加后结果的补码 printf(%d, c);//结果的补码-1--》取反 得结果的原码 //1 0000000 00000000 00000000 00001010 -- 》 -10 //最后10-20的结果打印出来后就是 -10 return 0; }三、不同数据类型之间的转换不同的数据类型之间是可以相互转换的一般可以分为两种隐式转换小字节转大字节低精度转高精度和显式转换又叫做强制类型转换大字节转小字节高精度转低精度。此外隐式转换时是不丢失信息的转换编译器会自动做比较安全合适但是强制类型的转换有数据丢失的风险必须手动强制转换将要转为的数据类型Type用()括起来才能强转。3.1隐式转换小字节转大字节规则符号位不变其余位补符号位。下面是小字节的a转换为大字节的数值展示#includestdio.h int main() { char a -128;//a的补码10000000 short a1 a; //其余位不变多余位补符号位1 //11111111 10000000 int a2 a; //11111111 11111111 11111111 10000000 long long a3 a; //11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000000 printf(a1%hd\n, a1);//11111111 10000000 --》减一取反 10000000 10000000-128 printf(a2%d\n, a2); //同上 -128 printf(a3%lld\n, a3);//同上 -128 printf(a1%hu\n, a1);//无符号位直接打印a165408 printf(a2%u\n, a2); //无符号位直接打印a24294967168 printf(a3%llu\n, a3);//无符号位直接打印:a318446744073709551488 return 0; }3.2显式转换强制类型转换大字节转小字节规则直接强行截取。下面是大字节的a转换为小字节的样例展示#includestdio.h int main() { int a 12345678;//转换为二进制0 0000000 10111100 01100001 01001110 //a的补码0 0000000 10111100 01100001 01001110 short b a;//将大字节的a赋给小字节的b直接强行截取 //b的补码0 1100001 01001110 printf(%hd\n, b);//正数的原码等于其补码 01100001 01001110 -》 24910 unsigned char c a;//将大字节的a赋给小字节的c直接强行截取 //c的补码01001110 printf(%hhu\n, c);//无符号位直接打印 01001110 -》 78 return 0; }强转时的数据丢失展示这里用double浮点型强转为int 整型时丢失小数部分为例int main() { double a 4.725; //将double类型的a强制转换为4个字节的int 类型并赋值给b //强制转换规则直接舍弃小数部分只保留整数部分不会进行四舍五入 int b (int)a; printf(%d\n, b);// 4 //使用int的格式控制符%d输出结果是4因为强制转换截断了小数部分 return 0; }不同数据类型的转换大致如上述所示这里简单总结一下首先两类转换的规则一定要记牢。判断清楚是大字节转小字节还是小字节转大字节以及对数据进行相关操作时切记计算机对数据的存储都是以补码形式存在操作数据时要用补码来进行。以及正负数补码得到的差异性要注意。还有一点值得注意的是计算机对所有的整数均以 int 类型处理 除了long long之外。样例说明如下#includestdio.h int main() { short a -123456; //计算机会先将 -123456 看作int类型 再将其补码强行截取赋给a //-123456的原码1 0000000 00000001 11100010 01000000 // 补码1 1111111 11111110 00011101 11000000 //a中存储的补码0 0011101 11000000 printf(%hd\n, a);//正数的原码等于补码 直接打印0 0011101 11000000 -》 7616 return 0; }以上便是该篇的所有内容了算是对C语言的内存存储以及类型的转换有了较为详细的介绍后续就会进行C语言的语法学习总结C语言的语法篇我们会学习分支与循环语句的执行逻辑及相关的代码实现敬请期待

相关新闻