一.字节长度
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;提高代码可读性