CPU(中央处理器):处理器,用来计算数据。RAM(随机存取存储器):内存,用来存储数据
日常中所说的“32GB”的B指的是byte(字节),1byte=8bit(位)
CPU与RAM中有三条总线:
1.地址总线:
2.数据总线
3.控制总线
定义的变量会在RAM内存空间中给出一部分空间用来存放数据,如果变量大小写名不一样,代表着两个不同的内存空间,变量之所以可以改变数值是因为有内存空间。
在学习数据类型之前需要弄清数据的存储方式,是如何存储到内存当中的。
数据存储有两种方式:大端和小端
大端序(Big Endian):最高有效字节存储在最低的内存地址,而最低有效字节存储在最高的内存地址。
小端序(Little Endian):最低有效字节存储在最低的内存地址,而最高有效字节存储在最高的内存地址。
假设有一个16位整数:0x12345678。
在大端中,存储的顺序为:0x12 0x34 0x56 0x78
在小端中,存储的顺序为:0x78 0x56 0x34 0x12
整型常量有三种表示方法
十进制数:123、-324、5
八进制数:最大数值是7且都以0开头的数,0123表示八进制数123;1234567
整型类型:(8个):short
、int
、long (int)
、long long (int)
、(unsigned/signed(默认))
int型存放数据方式
有符号位 |
无符号位 |
|
最大 |
2的31次方-1 |
2的32次方-1 |
最小 |
-2的31次方 |
0 |
int n=100
0x00000064
0000 0000 0000 0000 0000 0000 0110 0100
00 00 00 64
int n=-100:原码-反码-补码,符号位由最高位决定,0代表正,1代表负,其最根本原因如下:
注意:当用printf打印的时候,%d表示有符号十进制打印,要注意需要打印的是几进制数,必要需要进行进制转换(原码反码补码的操作)
1. 十进制小数:1.2、0.12、123.0
2. 指数形式:123e3表示123×10^3
1. double(双精度浮点型)8个字节
2. float(单精度浮点型)4个字节
在对两个数据做比较时,要注意变量类型要一致
比如
float a=0.9;
if(a==0.9)
{
printf("yes");
}
else printf("no");
输出no,应当改成if(a==0.9f)
,具体原因可以查看sizeof(0.9)的大小和sizeof(a)的大小
三步:符号位、阶码、尾数
1.char
' '
引用" "
const char* 打印的地址,要注意2.unsigned char:1字节(8bit),无符号位
printf
函数中的格式化字符串中可以使用不同的格式指示符(format specifiers)来指定要打印的变量的类型和格式
整数类型:
%d
:有符号十进制整数(常用)
%ld
:long long int型
%u
:无符号十进制整数
%o
:无符号八进制整数
%x
:无符号十六进制整数(小写字母)
%X
:无符号十六进制整数(大写字母)
浮点数类型:
%f
:浮点数(小数)(常用)
%e
:以指数形式表示的浮点数(小写字母)
%E
:以指数形式表示的浮点数(大写字母)
字符类型:
% c
:字符char
%s
:字 符串
指针类型:
%p
:指针地址
在printf打印中使用
用整型打印浮点型,将小数截断,只打印整数部分
使用短字节打印长字节,需要将高位截断,打印低位数据:用short 打印int
short s;
char z;
int i = 0x12345678;
s = i;
z = i
printf("%d \n ", s);
printf("%d \n ", z);
输出:
22136(0x5678)
120 (0x78)
使用长字节打印短字节,补齐高位,由最高位决定所补是0还是1,如果补0代表正数,如果补1代表负数,进行补码:用int 打印short
short s;
char z;
int i = 0x12345678;
s = i;
z = i
printf("%d \n ", s);
printf("%d \n ", z);
输出:
22136(0x5678)
120 (0x78)
%求余运算符
数据类型必须是整型或者兼容整型
分母不能为0
符号与左操作数有关,与右操作数无关
i++:先用再加。++i:先加再用。
三目运算符 ? :
布尔表达式?表达式1:表达式2
运算过程:如果布尔表达式的值为 true ,则返回 表达式1 的值,否则返回 表达式2 的值
define 声明变量赋值
#define one 100
const :
用于声明常量,表示变量的值不能被修改。const关键字可以用于声明常量指针,也可以用于函数参数,以确保函数不会修改参数的值。
const int i=100;
continue:
用于终止当前循环的迭代,转而执行下一次迭代。在循环中,continue会跳过本次循环体内剩余的代码,直接进行下一次迭代。
default:
在switch语句中用于标记默认情况。当switch的表达式的值与所有case都不匹配时,执行default后面的语句。
do:
用于创建一个do-while循环。do-while循环至少会执行一次循环体,然后根据while后面的条件判断是否继续执行。
enum:
用于创建枚举类型。枚举类型是一种用户定义的数据类型,用于定义一组命名的整数常量。
extern:
用于声明外部变量或函数,通常在一个文件中定义,在另一个文件中使用。extern关键字告诉编译器变量或函数是在其他文件中定义的。
static:
用于声明静态变量,使变量在整个程序执行期间保持存在。静态变量在函数调用之间保持它们的值。
struct:
用于定义结构体类型。结构体是一种用户定义的数据类型,用于组合不同类型的数据成员。
typedef:
用于为数据类型定义新的名称。typedef可以增强代码的可读性,并提供一种将数据类型命名为更具意义的名字的方式。
union:
用于定义联合类型。联合是一种数据结构,允许在相同的内存位置存储不同的数据类型。
volatile:
用于告诉编译器该变量的值可能会在未明确要求时被修改,因此编译器不应该进行优化。volatile关键字通常用于与硬件相关的变量,如硬件寄存器。
左值(lvalue):
右值(rvalue):
运算结果类型由低级别向高级别转换
int i=100;
float j=1.23;
printf("%f \n", i+j);
输出:101.23
printf("%f \n", 3/5 +4.3);
输出:4.3