1.进制
在C中,以0x或0X开头的数字常量被认为是十六进制的值。例如,我们可以将数字FA1D37B(16)写作0xFA1D37B,或者0xfald37b。
2.字
- 每台计算机都有一个字长( word size),指明整数和指针数据的标称大小( nominal size)。
- 因为虚拟地址是以这样的字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小。也就是说,对于一个字长为n位的机器而言,虚拟地址的范围为0~2"-1,程序最多访问2"字节。
3.类型所占字节的大小
4.声明指针
对于任何数据类型T,声明T* p; 表明p是一个指针变量。指向类型T的一个对象。例如char * p;就将一个指针声明为指向char类型的一个对象。
5.寻址和字节顺序
对于跨越多字节的程序对象,我们必须建立两个规则。
-
这个对象的地址是什么
-
我们在存储器中如何对这些字节排序。
在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节序列中最小的地址。
例如,假设一个类型为int的变量x的地址为0x100,也就是说,地址表达式 &x 的值为0x100。那么,x的四字节将被存储在存储器的0x100、0x101、0x102和0x103位置。
字节顺序
某些机器选择在存储器中按照从最低有效字节到最高有效字节的顺序存储对象,而另一些机器则按照从最高有效字节到最低有效字节的顺序存储。前一种规则一一最低有效字节在最前面的方式被称为小端法(little endian)。后一种称为大端法。
示例
假设x类型为int,位于地址0x100处,有一个十六进制值为0x01234567。地址范围0x100~0x103的字节顺序依赖于机器的类型:
6.整数的表示(重要)
1.位运算
- 如果进行位运算的值大于机器字长,一般对其进行取模运算后,在进行位运算。
无符号数 | 有符号数 | |
---|---|---|
左移 | 逻辑左移(直接补0) | 逻辑左移 |
右移 | 逻辑右移 | 算术右移(补位的数 和最高位相同 |
2.补码
- 尽管c语言中没有明确表示,但是一般 用补码来表示 有符号整数。
- 补码可以直接得到十进制整数,不用转换成源码。
B2T(1011) = -1*2^3 + 1* 2^1 + 1* 2^0 = -5 # 1011为补码, -5 为十进制值
- 易错点: -1 的补码表示法为 11111111(8进制),不少人会写错位 10000001。
3. 有符号数转换成无符号数(T2U)
- 二进制的位模式不变,但是解释这些位模式的方式变了。
4.无符号数转化为有符号数(U2T)
在c语言中,无符号数和有符号数进行运算时,会隐式的将有符号数转换成无符号数。
# include<stdio.h>
int main(){
int a=-1;
unsigned int b=0;
if (a<b)
printf("-1<0");
else
printf("-1>0");
}
- 结果如图
5.数据类型转换
当从一个较小的数据类型转换为较大的数据类型(如short ——int):
- 无符号数补 0 即可。
- 有符号数 补 符号位即可。
当从一个较大的数据类型转换为较小的数据类型(如int ——short):
-
无符号数 截取k位, 可以对 剩余的k位 取模,得到结果。最下边是类比十进制的。
-
有符号数 1. 先通过截断无符号数的方式截断有符号数,再将无符号数转换为有符号数。