加强 网站群建设管理,12355能找回智慧团建密码吗,万网虚拟主机wordpress,网站怎么自适应 #x1f341; 博客主页:江池俊的博客 #x1f4ab;收录专栏#xff1a;C语言——探索高效编程的基石 #x1f4bb; 其他专栏#xff1a;数据结构探索 #x1f4a1;代码仓库#xff1a;江池俊的代码仓库 #x1f3aa; 社区#xff1a;GeekHub #x1f341; 如果觉… 博客主页:江池俊的博客 收录专栏C语言——探索高效编程的基石 其他专栏数据结构探索 代码仓库江池俊的代码仓库 社区GeekHub 如果觉得博主的文章还不错的话请点赞收藏 三连支持一下博主 数据类型介绍
- 基本的内置类型 1. char 占1个字节 -----字符数据类型 2. short 占2个字节 ----- 短整型 3. int 占4个字节 -----整形 4. long 占4/8个字节 -----长整型 5. long long 占8个字节 ----- 更长的整形 6. float 占4个字节 ----- 单精度浮点数 7. double 占8个字节 ----- 双精度浮点数 注意C语言中没有字符串类型 类型的意义
内存占用和范围不同的数据类型在内存中占用不同的字节数并且能够表示的数值范围也不同。正确选择数据类型可以优化内存使用同时确保数据不会超出所允许的范围避免溢出和精度丢失的问题。数据操作和运算规则不同数据类型支持不同的操作并且对于不同数据类型之间的运算有明确的规则。了解这些规则可以帮助开发者正确地处理数据避免数据转换错误和意外的计算结果。类型检查和数据表达C语言是一种静态类型语言编译器在编译时会对数据类型进行检查。正确定义数据类型可以帮助发现类型错误和潜在问题增强代码的可靠性。此外不同的数据类型也能够更直观地表达数据使代码更易读和理解。
类型的基本归类
整形家族 char unsigned char无符号字符型范围为 0 到 255。 signed char一个字节大小的有符号整数范围为 -128 到 127。 注意char是否为signed charC语言标准并没有规定取决于编译器。 字符在内存中存储的是字符的ASCII码值ASCII码值是整型所以字符类型归类到整型家族short unsigned short [int]无符号短整型范围为 0 到 65,535。 signed short [int]两个字节大小的有符号整数范围为 -32,768 到 32,767。int unsigned int无符号整型范围为 0 到 4,294,967,295。 signed int四个字节大小的有符号整数范围为 -2,147,483,648 到 2,147,483,647。long unsigned long [int]无符号长整型范围取决于编译器但至少和 unsigned int 类型的范围相同。 signed long [int]四个或八个字节大小的有符号整数范围取决于编译器但至少是 int 类型的范围。 以下以char的两种类型为例其他类型类似我们可以利用画圈的方法来方便我们的记忆我个人让我这是一个非常好的方法牛具体参照下方两幅图片
浮点数家族 floatfloat是单精度浮点类型通常占用4个字节32位。它可以表示大约6到7位有效数字并且具有范围约为1.2E-38到3.4E38的取值范围。在表示浮点数时通常使用后缀f或F来标识float类型例如3.14f。doubledouble是双精度浮点类型通常占用8个字节64位。它可以表示大约15到16位有效数字并且具有更大的范围约为2.3E-308到1.7E308。在表示浮点数时C语言通常默认为double类型不需要显式指定后缀。例如3.14表示的是double类型。 构造类型: 数组类型结构体类型 struct枚举类型 enum联合类型 union 指针类型: 1. int *pi; 2. char *pc; 3. float* pf; 4. void* pv;无具体类型的指针 空类型: void 表示空类型无类型 通常应用于函数的返回类型、函数的参数、指针类型。 整形在内存中的存储
我们之前讲过一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。 那接下来我们谈谈数据在所开辟内存中到底是如何存储的 比如
int a 20;
int b -10;我们知道为 a 分配四个字节的空间。 那如何存储 下来了解下面的概念
原码、反码、补码
计算机中的整数有三种2进制表示方法即原码、反码和补码。 三种表示方法均有符号位和数值位两部分符号位都是用0表示“正”用1表示“负”而数值位 正数的原、反、补码都相同。 负整数的三种表示方法各不相同。 在我上一篇文章中也有涉及到具体请移步【C语言】操作符—详解 原码 直接将数值按照正负数的形式翻译成二进制就可以得到原码。反码 将原码的符号位不变其他位依次按位取反就可以得到反码。补码 反码1就得到补码。 注意补码1得到的是原码。
对于整形来说数据存放内存中其实存放的是补码。 为什么呢 在计算机系统中数值一律用补码来表示和存储。原因在于使用补码可以将符号位和数值域统一处理 同时加法和减法也可以统一处理CPU只有加法器此外补码与原码相互转换其运算过程 是相同的 不需要额外的硬件电路。 我们看看在内存中的存储 注意这里是各个变量对应补码的16进制表示形式 我们可以看到对于a和b分别存储的是补码。但是我们发现顺序有点不对劲。 这是因为数据的存储被分为大小端两种情况。
大小端介绍
1. 什么是大端小端 - 大端存储模式是指数据的低位保存在内存的高地址中而数据的高位保存在内存的低地址中。 - 小端存储模式是指数据的低位保存在内存的低地址中而数据的高位保存在内存的高地址中。 2.为什么有大端和小端 为什么会有大小端模式之分呢这是因为在计算机系统中我们是以字节为单位的每个地址单元 都对应着一个字节一个字节为8 bit。但是在C语言中除了8 bit的char之外还有16 bit的short 型32 bit的long型要看具体的编译器另外对于位数大于8位的处理器例如16位或者32 位的处理器由于寄存器宽度大于一个字节那么必然存在着一个如何将多个字节安排的问题。因 此就导致了大端存储模式和小端存储模式。 例如一个 16bit 的 short 型 x 在内存中的地址为 0x0010 x 的值为 0x1122 那么 0x11 为 高字节 0x22 为低字节。对于大端模式就将 0x11 放在低地址中即 0x0010 中 0x22 放在高 地址中即 0x0011 中。小端模式刚好相反。我们常用的 X86 结构是小端模式而 KEIL C51 则 为大端模式。很多的ARMDSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式 还是小端模式。 练习
1.百度2015年系统工程师笔试题
题目描述请简述大端字节序和小端字节序的概念设计一个小程序来判断当前机器的字节序。10分 思路 因为1的二进制序列的16进制表示形式为00 00 00 01所以如果机器是小端字节序存储形式那么整型 1 在内存中存储地址由低到高依次为 01 00 00 00如果机器是大端字节序存储形式那么在整型 1 在内存中存储地址由低到高依次为 00 00 00 01这时我们可以利用字符cha型指针访问此地址存储的值因为char型指针一次只能访问一个字节所以如果是小端则访问的值为01如果是打端则访问的值是00。 #include stdio.h
int check_sys()
{int i 1;return (*(char *)i);
}
int main()
{int ret check_sys();if(ret 1){printf(小端\n);}else{printf(大端\n);}return 0;
}2.练习2
//下面程序输出什么
#include stdio.h
int main()
{char a -1;//10000000000000000000000000000001 -a的原码//11111111111111111111111111111110//11111111111111111111111111111111 -a的补码//11111111 - asigned char b-1;//11111111 - bunsigned char c-1;//11111111 - cprintf(a%d,b%d,c%d,a,b,c);//结果为a-1 b-1 c255//%d 是以10进制的形式打印有符号的整数//打印时ab为有符号的char所以打印时将第一个1看成符号位在左边补上24个1//所以打印时ab又变成11111111111111111111111111111111但这是补码//打印的数字需要为原码对应的值所以转换为原码为 //10000000000000000000000000000001对应的十进制为-1//而c为无符号的char所以打印时不分符号位左边补上24个0//即为00000000000000000000000011111111//因为无符号为正数所以原码补码相同对应的十进制为255 return 0;
}3.练习3
#include stdio.h
int main()
{char a -128;//10000000000000000000000010000000 -a的原码//11111111111111111111111101111111//11111111111111111111111110000000 -a的补码//10000000 - 内存中存储的a//打印时需要整型提升此时看a的类型因为a的类型为有符号的char//所以将内存中a的首位看成符号位为1则左边全补上1为0则全补0//即11111111111111111111111110000000 ---将它看成无符号的数打印//则它是一个很大的数值为4294967168printf(%u\n,a);//结果为4294967168//%u 是10进制的形式打印无符号的整数//%d 是10进制的形式打印有符号的整数return 0;
}#include stdio.h
int main()
{char a 128;//00000000000000000000000010000000 -a的原码反码补码//10000000 -内存中存储的a//11111111111111111111111110000000 - a整型提升后的值printf(%u\n,a);//结果为4294967168//%u 是10进制的形式打印无符号的整数//%d 是10进制的形式打印有符号的整数return 0;
}4.练习4
int i -20;
//10000000000000000000000000010100 -i的原码
//11111111111111111111111111101011
//11111111111111111111111111101100 -i的补码
unsigned int j 10;
// 00000000000000000000000000001010 -j的原码反码补码
// 11111111111111111111111111101100
// 11111111111111111111111111110110 -ij的补码
// 10000000000000000000000000001001 -ij的反码
// 10000000000000000000000000001010 -ij的原码对应十进制值为-10
printf(%d\n, ij); //结果为-10
//按照补码的形式进行运算最后格式化成为有符号整数5.练习5
unsigned int i;//因为是无符号的整型所以i一直大于等于于0
for(i 9; i 0; i--)
{printf(%u\n,i);
}//所以此代码会进入死循环如图说示i9开始逆时针走一直在0~65535这个范围内。
6.练习6
int main()
{char a[1000];int i;for(i0; i1000; i){a[i] -1-i;//这里也可以使用画圈的方法数组中的值从-1开始一直到0如下//-1 -2 -3 -4 -5 .. -128 127 .. 6 5 4 3 2 1 0 //-1~-128一个有128个数127~1一共有127个数所以共有128 127 255}printf(%d,strlen(a));//strlen 统计的是\0之前出现的字符的个数//\0 - 对应的ASCII码值0 return 0;
}7.练习7
#include stdio.h
unsigned char i 0;
//无符号的插入取值范围在0~255之间
int main()
{for(i 0;i255;i)//i的值从0到255然后再从255到0一直这样循环{printf(hello world\n);//陷入死循环}return 0;
}今天的分享就到这里如果觉得博主的文章还不错的话请三连支持一下博主哦