1.有符号数和无符号数
有符号数就是最高位为符号位,0代表正数,1代表负数
无符号数最高位不是符号位,而就是数的一部分而已。
1011 1111 0000 1111 1111 0000 1011 1010,如果当有符号数看待,那么他是一个负数的补码,如果当一个无符号数看待,他就是一个正数的原码
无符号数最小为0,不可能是负数
定义一个无符号的int
unsigned int a; //使用unsigned int 定义了一个无符号的int变量,名字叫a
short,long,long long, unsigned int
short是短整型,一般short是int的一半大小,short在32位的windows下是2个字节
short最大能存放多大的十六进制数?7fff
当一个小的数据类型赋值给一个大的数据类型,不会出错,因为编译器会自动转化,但当一个大的类型赋值给一个小的数据类型,那么就可能丢失高位。
long是长整型,long的大小变化比较多,在32位的windows下是4个字节,在64位的windows是4个字节,在32位的linux是4个字节,在64位的linux是8个字节。
long long长长整型,longlong在32位系统和64位系统下都是8个字节
unsigned int,unsigned short ,unsigned long, unsigned long long
100默认是int,100L代表long类型的常量,100LL代表long long类型的常量
100u代表unsigned int类型的常量,如果想表达一个unsigned long long 类型的常量,100ull
9l,9L,9ll,9LL,9u,9ull,9ULL
2. printf输出值
%d是输出一个有符号的10进制int类型
%o,输出8进制的int
%x,输出16进制的int
%X,输出16进制的int,但abcd这些都用大写字母
%u,输出一个10进制的无符号数
%p 输出内存地址
%u的意思是输出一个unsigned int 类型的数
%lu的意思是输出一个unsigned long 类型的数
%f 的意思是输出float类型的数
%lf是输出double ,long double 类型的浮点数
%c是输出一个char类型的字符
例:以十六进制形式输出一个byte值,带前缀,空位补0:
byte a = 10;
printf("a is: %#04x ", a);
得到的值是:0x0a
# 代表加上十六进制的前缀也就是0x, 04代表输出宽度为4,宽度不足以0补齐。
3. 大端对齐和小端对齐
计算机的内存最小单位是什么?是BYTE,是字节,一个大于BYTE的数据类型在内存中存放的时候要有先后顺序。
高内存地址放整数的高位,低内存地址放整数的低位,这种方式叫到着放,术语叫小端对齐。X86和ARM都是小端对齐的。
高内存地址放整数的低位,低内存地址放整数的高位,这种方式叫正着放,术语叫大端对齐,很多unix服务器的CPU是大端对齐的。
定义一个int类型的变量a,在VS下可以看到其在内存中的排列方式如下:
说明windows系统是小端对齐的。