本章重点:
-
数据类型详细介绍
-
整形在内存中的存储:原码、反码、补码
-
大小端字节序介绍及判断
-
浮点型在内存中的存储解析
1.数据类型介绍
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
//C语言有没有字符串类型?
类型的意义:
-
使用这个类型开辟空间的大小(大小决定了使用的范围)。
-
如何看内存空间的视角。
1.1 类型的基本归类:
整形家族:(char 虽然是字符类型,但是字符类型存储的时候,存储的字符是ascii码值,ascii值是整数)
char
unsigned char
signed char
//char c1;//char到底是有符号?还是无符号?-->不确定,是取决于编译器的实现。
//signed char c2;
//unsigned char c3;
short
unsigned short [int]
signed short [int]
//short s1;//有符号
//short 等价于 signed short
//signed short s2;//有符号
//unsigned short s3;//无符号的short
//有正负数据可以存放在有符号的变量中
//只有正数的数据可以存放在无符号的变量中
//int可省略
int
unsigned int
signed int
//int n1;//n1就是有符号的,int等价于signed int
//signed int n2;
//unsigned int n3;
long
unsigned long [int]
signed long [int]
//long n = 0;long 等价于signed long
//signed long n2 = 0;
//unsigned long n3;
浮点型家族:
float
double
//long double
构造类型:(自定义类型)
>数组类型
//int arr[10];//arr的类型是:int [10]
//int arr2[4];//int [4]
//char arr3[4];//char [4]
//int a[]={0,0,0};//int [3]
>结构体类型 struct
>枚举类型 enum
>联合类型 union
指针类型:
int *pi;
char *pc;
float* pf;
void* pv;
//指针变量是用来存放地址!
空类型:
void 表示空类型(无类型) 通常应用于函数的返回类型、函数的参数、指针类型。
2.整形在内存中的存储
2.1 原码、反码、补码
计算机中的整数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//整数可以写出三种2进制表示形式:
//原码:直接将数值按照正负数的形式翻译成二进制就可以
//反码:将原码的符号位不变,其他位依次按位取反就可以得到了
//补码:将反码+1
//正整数的原码、反码、补码相同
//负数的原码、反码、补码是需要计算的
int main()
{
int a = 10;//整型值
//原码:00000000000000000000000000001010
//反码:00000000000000000000000000001010
//补码:00000000000000000000000000001010
int b = -10;
//原码:10000000000000000000000000001010
//反码:11111111111111111111111111110101
//补码:11111111111111111111111111110110
// F F F F F F F 6
//0xff ff ff f6
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
1 - 1;
//1+(-1);
//CPU只有加法器
//使用补码的二进制计算
//00000000000000000000000000000001
//10000000000000000000000000000001
//11111111111111111111111111111111
// 100000000000000000000000000000000
//0
//10000000000000000000000000000001 -1的原码
//11111111111111111111111111111110 -1的反码
//11111111111111111111111111111111 -1的补码
//
//使用原码计算是错误的
return 0;
}
正在上传…
取消
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
unsigned int ch = -10;
//-10
//10000000000000000000000000001010
//11111111111111111111111111110101
//11111111111111111111111111110110
//
//printf("%u\n",ch);//%u是打印无符号数,意思是你要我打印的是无符号数,不是无符号数,我也认为是无符号数。
//printf("%d\n",ch);//%d是打印有符号数,意思是你要我打印的是有符号数,不是有符号书,我也认为是有符号数。
return 0;
}
2.2 大小端介绍
大小端字节序存储
大端字节序存储:把一个数据低位字节处的数据存放在高地址处,把高位字节的数据放到低地址处。
小端字节序存储:把一个数据低位字节处的数据存放在低地址处,把高位字节的数据放到高地址处。
百度2015年系统工程师笔试题:
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)
int check_sys()
{
int a=1;
return *(char*)&a;
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("大端\n");
}
else
{
printf("小端\n");
}
return 0;
}
2.3 练习
1.
//输出什么?
#include <stdio.h>
int main()
{
char a= -1;
//100000000000000000000000000000001
//111111111111111111111111111111110
//111111111111111111111111111111111
//
//11111111
//111111111111111111111111111111111
//111111111111111111111111111111110
//100000000000000000000000000000001
//
signed char b=-1;
unsigned char c=-1;
//100000000000000000000000000000001
//111111111111111111111111111111110
//111111111111111111111111111111111
//11111111 -c
//000000000000000000000000111111111
//
printf("a=%d,b=%d,c=%d",a,b,c);
//-1 -1 255
//当我们打印a的时候,要发生整型提升
//打印的是有符号数
return 0; }