c语言数据类型浅析

本文深入探讨了C语言中的数据类型,包括在16位、32位和64位编译器下的内存占用情况。同时,详述了sizeof运算符的使用,以及数值存储方法,如正负符号、原码、反码、补码、unsigned类型和大端/小端存储。还讨论了浮点型数据的表示及类型自动转换规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:C语言数据类型分类

这里写图片描述

二:数据类型与内存的关系

字也叫Word 字节也叫Byte 位也叫bit
1个字=2个字节
1个字节=8位
1K=1024B
1M=1024K
1G=1024M
1T=1024G
不同编译器对应的数据类型占内存大小也不同

16位编译器

char :1个字节
char*(即指针变量): 2个字节
short int : 2个字节
int: 2个字节
unsigned int : 2个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节

32位编译器

char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节

64位编译器

char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节各种数据类型

三:sizeof运算符

此处只讨论sizeof计算数据类型占用内存大小

=>sizeof是个单目运算符,用来计算操作数在内存中占据的字节数,其操作数既可以是括在圆括号中的类型标识符,其返回值是size_t类型,即无符号整数
=>sizeof的结果与系统有关
如:不同编译器下 sizeof(int)得到的结构不同
=>sizeof是运算符,不是函数
=>sizeof(结构体/共用体),求得的大小与内存对齐有关,可以用#pramga pack(x),指定结构体内存对齐大小。

sizeof与strlen区别注意点(简单归纳):

strlen()是库函数,()中必须是字符串指针或字符串常量,它返回的是检测对象中第一个'\0'前的字符个数,不含'\0'。
sizeof是操作符,不是函数。它后面的()并不是必须的,没有歧意时就不必写上了。sizeof操作符计算的是系统为它后面的变量或类型名分配的空间大小,无论其中是否存储了有用数据。

四:数值存储方法

在计算机的数值存储世界里面,采用0和1存储。

讨论部分内容,正负符号作用、原码、反码、补码、unsigned类型、大端/小端存储。

正负符号作用

         整数的正负——有符号和无符号。正数和负数是两种情况,要区分两种情况,
         用二进制的一位刚好可以表示,比如用0表示正数,1表示负数。
         C语言中确实就是用最高位来表示一个整数的正负号,0表示为正,1表示为负。

原码、反码、补码

概述:

数值的表示方法——原码、反码和补码
原码:最高位为符号位,其余各位为数值本身的绝对值
反码:
正数:反码与原码相同
负数:符号位为1,其余位对原码取反
补码:
正数:原码、反码、补码相同
负数:最高位为1,其余位为原码取反,再对整个数加1
采用原码表示法简单易懂,但它的最大缺点是加法运算复杂。这是因为,当两数相加时,如果是同号则数值相加;如果是异号,则要进行减法。而在进行减法时还要比较绝对值的大小,然后大数减去小数,最后还要给结果选择符号。为了解决这些矛盾,人们找到了补码表示法。
例:
int main(void)
{
int x = -1;
printf(“x1 = %x/n”, x);
printf(“x2 = %u/n”, x);
printf(“x3 = %d/n”, x);
return 0;
}
-1以补码的形式存储,即在32位编译器下:1111 1111 1111 1111 1111 1111 1111 1111
代表-1;打印结果: x1 = 0xffffffff x2 = 4294967295 x3 = -1;%u按照无符号来解析,没有符号位,所以32位全部为数据;%d按照有符号来解析,第一位为符号位,剩下31为数据位;

unsigned类型

整型的每一种都分有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的正整数数据,比如16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。另外,unsigned若省略后一个关键字,大多数编译器都会认为是unsigned int。

大端存储、小端存储

所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
至于为什么会有大端小端存储方式不同的原因在这个不进行讲解。
这里写图片描述

五:浮点型

浮点型常量有两种表示形式:十进制小数形式和指数形式。

实型常量的类型细分:默认为double型,例如3.14就是double类型,  后面加f或F认为是float型,例如3.14f就是float类型

float和double的区别:

 float型数据占用4个字节(32bits)存储单元,提供的有效数字是6~7位;
 double型数据占用8个字节(64bits)存储单元,提供的有效数字是15~16位。

类型自动转换

混合类型进行计算的时候

 低字节类型向高字节类型转换,极限范围小的向极限范围大的转换

这里写图片描述

赋值的时候进行自动类型转换

赋值号会将右边的表达式转换成左边的类型。大数据会被转成小数据,小数据也会被转成       大数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值