本章重点
1.数据类型详细介绍
2.整形在内存中的存储:原码、反码、补码
3.大小端字节介绍及判断
4.练习
数据类型详细介绍
数据类型介绍
基本的内置类型:
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点型
double //双精度浮点型
类型的意义:
1.使用这个类型开辟内存空间的大小(大小决定了使用的范围)
2.如何看待内存空间的视角
类型的基本归类
整形家族
表示范围:limits.h
char
unsigned char
signed char
short
unsigned short
signed short
int
unsigned int
signed int
long
unsigned long
signed long
注意:char类型存储的是ASCII值因此归为整形
浮点数家族
表示范围:float.h
float
double
构造类型
数组类型
#include<stdio.h>
int main()
{
int arr[10]; // int [10] 这就是一种类型
int arr2[5]; //int [5] 另一种类型
return 0;
}
结构体类型 struct
枚举类型 enum
联合类型 union
指针类型
int *pi
char *pc
float *pf
void *pv
空类型
void 表示空类型(无类型)
通常应用于函数的返回类型 void test()
函数的参数 void test(void)
指针类型 void *pv
整形在内存中的存储
数据在内存中以2进制的形式存储
对于整数来说
整数的二进制有三种表示形式:原码、反码、补码
正整数:原码、反码、补码相同
负整数:原码、反码、补码不同,补码要进行计算的
三种表示方法均有三种符号位和数值为两部分,符号位都是用0表示的正,用1表示负,而数值位三种表示方法个不相同
按照数据的数值直接写出的二进制序列就是原码
原码的符号位不变,其他位按位取反,得到的就是反码
反码+1,得到的就是补码
整数在内存中存储的是补码
为什么不是原码呢?!
在计算机中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的(即取反,在+1),不需要额外的硬件电路。
大小端介绍
引例
发现在当前编译器底下,这些补码都是倒着存储的
什么是大端小端
大端(存储)模式(大端字节序),是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
小端(存储)模式(小端字节序),是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。
练习
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。
第一问如上(定义)
优化:
int check_sys()
{
int a = 1;
return *(char*)&a;//返回1表示小段,返回0表示大段
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
练习
题目
//输出的是什么
#include<stdio.h>
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a=%d\nb=%d\nc=%d\n", a, b, c);
return 0;
}
结果
解析
2.
题目
#include<stdio.h>
int main()
{
char a = -128;
printf("%u\n", a);
return 0;
}
结果
解析
3.`
题目
#include<stdio.h>
int main()
{
char a = 128;
printf("%u\n", a);
return 0;
}
结果
解析
4.
题目
#include<stdio.h>
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}
结果
解析
5.
题目
#include<stdio.h>
int main()
{
unsigned int i;
for (i = 9;i >= 0;i--)
{
printf("%u\n", i);
}
return 0;
}
结果
死循环
解析
因为当i为负数时会将i转化为较大的正整数(因为i为unsigned int类型)
题目
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char a[1000];
int i;
for (i = 0;i < 1000;i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}
结果
解析
补充
7.
题目
#include<stdio.h>
unsigned char i=0;
int main()
{
for (i = 0;i <=255;i++)
{
printf("hello world\n");
}
return 0;
}
结果
死循环
解析
当i=256(i最大为255)是会把i转化为0(i为unsigned char类型)从而进行死循环。
待续…