C语言数据类型(二)——数据类型重要知识点

本文介绍了C语言中数据类型的字节长度及其测量方法,包括int、char、short、long等的字节大小,并讨论了sizeof和strlen的区别。接着讲解了数据的原码、反码、补码概念以及带符号数用补码表示的优点。最后,阐述了有符号与无符号数据类型的区别以及如何处理数据溢出和提高代码移植性。

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

一.字节长度

bit、字节(B)=8bit、半字=2个字节=16bit、字=4个字节=32bit

1.  计算机存储方式

int num = 5;

int *p = #

int **p = &p;


1.  如何测量变量的字节长度

int num = 5;

sizeof(num)或sizeof num或sizeof(int)但不能写成sizeof int

sizeof(char) = 1

sizeof(short)= 2

sizeof(int)= 4

sizeof(long)= 4

sizeof(float)= 4

sizeof(double)= 8

sizeof(long long)= 8

任何类型的指针,字节长度都为4(指针用来保存地址,地址长度固定,由操作系统决定,操作系统为32位时字节长度为4,操作系统为64位时字节长度为8)。

sizeof与strlen的区别:

sizeof(...)是运算符,在头文件中typedef为unsignedint,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。

strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
     它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符’\0’。返回的长度大小不包括’\0’。

sizeof:运算符,字节长度(包含’\0’)

strlen:函数,测量字符串的字符个数(不包含’\0’)

        实例:




二.取值范围

数的原码、反码、补码:

原码:一个整数,按照绝对值大小转换成的二进制数,最高为为符号位,称为原码。

反码:将二进制除符号位数按位取反,所得的新二进制数称为原二进制数的反码。 

正数的反码为原码,负数的反码是原码符号位外按位取反。 

补码:反码加1称为补码。 
正数:正数的补码和原码相同。

负数:按照规则来
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。

比如 00000101 是5的原码

00000101 是5的反码

00000101 是5的补码

10000101 是-5的原码

11111010 是-5的反码

11111011 是-5的补码

正数原码=补码

负数补码=绝对值的原码取反加1

负数原码=补码取反加1

l  计算机中的带符号数用补码表示的优点:

1)   负数的补码与对应正数的补码之间的转换可以用同一种方法——求补运算完成,可以简化硬件;

2)   可将减法变为加法,省去减法器;

3)   无符号数及带符号数的加法运算可以用同一电路完成。

取值范围分为有符号数与无符号数

unsigned char:0~255

(0000 0000~1111 1111)

signed char:-128~127

(0 000 0000~0 111 1111,

1 000 0000à1 111 1111+1=-128

1 111 1111à1 000 0000+1=-1)

实例:





数据溢出计算机如何处理?

实例:


三.有符号与无符号(常量是有符号的)

1.  有符号与无符号的区别

Ø  声明无符号整型时,我们都加上unsigned int ,而声明有符号整型时用signed int,我们平常直接写int,省掉了signed。另外,unsigned若省略后一个关键字,大多数编译器都会认为是unsigned int。

Ø  在计算机中,整数是以补码形式存放的(只是带符号的整数采用补码存储表示的,浮点数另有其存储方式)。

Ø  无符号数没有原码、反码和补码一说。只有有符号数才存在不同的编码方式。

Ø  整形数运算,总是遵循一个原则:小的往大的扩展。

从小到大:short -> unsignedshort -> int -> unsigned int

Ø  有符号数与无符号数的取值范围不同。

Ø  有符号与无符号进行比较时(==、<、>、<=、>=),有符号数隐式转换成无符号数(即底层的补码不变,但是此数从有符号数转换为无符号数)

2.  如何提高无符号与有符号的代码移植性

typedef unsigned char Char;提高代码移植性

typedef int Age;提高代码可读性


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值