(强数据类型)
1.常量
常量是程序中不可变的量
10为常量
两种常量
#define 定义宏常量
const
#对于#define 类型的常量,c语言的习惯是常量名称大写, 对于普通const常量以及变量,一般以小写结合大写的方式
#include <stdio.h> int main() { printf("%d", 10); return 0; }
#include <stdio.h> #define MAX 10 //定义一个宏常量 值为10 int main() { printf("%d", MAX); return 0; }
#include <stdio.h> #define MAX 10 //定义一个宏常量 值为10 int main() { //MAX = 200; //等号左边必须为变量,不能为常量,常量的值不能修改 printf("%d", MAX); return 0; }
#include <stdio.h> int main() { const int a = 100; printf("%d", a); return 0; }
以上为整数常量
字符串 常量
#include <stdio.h> #define STRING "hello world "; int main() { const char * str = "hello c"; }
2. 二进制 位 字节 字
一个位只能表示 0 1 两种状态 bit 1位位1bit
一个字节为八个二进制 8位 BYTE 8个bit一个字节
500GB B为BYTE 10Mb bit
1个字 2个字节 简称WORD
2个字为双字 ZWORD
0 八进制 0x 16进制
原码 反码 补码
整数占 4个字节 以下只写了 1个字节举例子
sizeof 关键字
是c语言关键字,功能是求指定数据类型所占用的字节数。
#include <stdio.h> int main() { printf("%d ", sizeof(10)); return 0; }
32位(bit)操作系统返回的为4 最大的存储的数字 2(32-1) 的数字
size_t 类型
int类型
int 常量变量
int 是32位的一个二进制整数,在内存中占据4个字节‘’
%d , 输出一个有符号的10进制整数
%u , 代表输出一个无符号的10进制的整数
int main() { printf("%x ", 0x10);//输出10 printf("%x ", 10);//输出十进制10对应得十六位a printf("%x ", 0xa);//输出a return 0; }
#include <stdio.h> int main() { printf("%x ", 0x10);//输出10 printf("%x ", 10);//输出十进制10对应得十六位a printf("%x ", 0xa);//输出a printf("%x", -7); return 0; } /* printf("%x", -7); 输出 fffffff9(这是-7的补码转换为16进制) 源码 10000000 00000000 000000000 00000111 反码 11111111 11111111 111111111 11111000 补码 11111111 11111111 111111111 11111001 */
/*
-7
1000 0111 用有符号的眼光-7 无符号的眼光135
*/
%x 代表输出十六进制数 (十六进制不表达负数)
%X 用大写字母方式输出16进制数
%o 输出八进制数 (2进制与八进制不表达负数)
short、 long 、int 、 long long 、unsigned 、signed(有符号数)
short 为短整数 在32位操作系统占2个字节
long 代表长整数, 在32位系统下位4个字节 在64位系统下,windows 4个字节 Unix 为八个字节(不同的操作系统不一样)
int (32位系统以上)不论在什么情况下都是4个字节
long long 是64位 也就是八个字节的整数 对于32位操作系统cpu寄存器位32位的,计算longlong类型的数据, 效率很低
unsigned 无符号的数,可以加在任意整数类型后面
#include <stdio.h> int main() { int a = 10;//4个字节 short b = 10; printf("%d ", sizeof(b));//2 return 0; }
#include <stdio.h> int main() { int a = 10;//4个字节 short b = 10; long long c = 10; printf("%d ", sizeof(c));//8 return 0; }
#include <stdio.h> int main() { int a = 10;//4个字节 short b = 10; long long c = 10; unsigned int d = 10; printf("%d ", sizeof(d));//4 return 0; }
整数溢出
一个整数计算的时候超过整数能够容纳的最大单位后,整数会溢出,溢出的结果是高位舍弃。
当一个小的整数复制给大的整数,符号位不会丢失,会集成
unsigned short abc = 0xffff; abc = abc + 1; printf("%d ", abc);//0 return 0;
#include <stdio.h> int main() { int a = 10;//4个字节 short b = 10; long long c = 10; unsigned int d = 10; printf("%d ", sizeof(d));//4 unsigned short abc = 0xffff; //abc = abc + 1; //printf("%d ", abc);//0 abc = abc + 100; printf("%d ", abc);//99 abc = 2; abc = abc - 5; printf("%u ", abc);//65533 int i1 = 0x12345678; abc = i1; printf("%x ", abc);//5678 short abc1 = -2; //1000 0000 0000 0010 //1111 1111 1111 1101 //1111 1111 1111 1110(-2) //1111 1111 1111 1111 1111 1111 1111 1110 i1 = abc1; printf("%x ", i1);//fffffffe unsigned short abc2 = 0; abc2 = abc2 - 1; //00000000 00000000 //10000000 00000001 //11111111 11111110 //11111111 11111111(65535) printf("%d ", abc2);//65535 //00000000 00000000 00001100 //10000000 00000000 00000000 00001010 //11111111 11111111 11111111 11110110 return 0; }
内存都是以字节为单位的
1个整数,4个字节
大端对齐 与小端对齐
对于arm,intel 这种x86 构架的复杂指令CPU ,整数在内存是倒着放的,低地址放高位,高地址放低位, 小端对齐
但对于uniux服务器的CPU,更多的是采用大端对齐的方式存放整数