发布于2022年10月15日2年前 数据类型 Day1 0、 计算机只是一个工具,计算的工具,通过计算来帮我们解决问题 计算机保存问题中数据? 先保存问题的抽象数据,然后再对抽象数据进行某一种运算 运算后就能得到一个结果,数据应该怎么去保存? 数据有什么属性: 大小 整数/小数 .... 这些属性我们就是通过数据类型来体现。 1、C语言的数据类型 有四大数据类型: (1)基本数据类型 C语言已经帮我们定义好了,我们就能直接拿过来使用 整型数据:用来保存整数 short [int] //短整型 int //整型 long [int] //长整型 long long [int] //长长整型 为什么非要分这么多类? 表示的数据大小范围不一样 1字节 = 8bit short “一般”来讲 占2字节 int “一般”来讲 占4字节 long “一般”来讲 占4字节 long long “一般”来讲 占8字节 “一般” 是指不一定就是这么多,和所用使用的机器有关 “一般” 是指32位机器下 如果记不住怎么办? 提供了一个关键字 ---> sizeof 求一个对象的所占字节数 unsigned / signed 表示 无符号 / 有符号(默认有符号) 0 1 代表高低电平 无符号:所有的bit位都是数据位 有符号:最高bit位代表是符号,其余位是数据位 0代表是正数,1代表的是负数 unsigned short 无符号短整型 (signed) short 有符号短整型 unsigned int 无符号整型 (signed) int 有符号整型 unsigned long 无符号长整型 (signed) long 有符号长整型 unsigned long long 无符号长长整型 (signed) long long 有符号长长整型 字符型:用来保存字符的 char: 在任何机器上面都是1字节,8bit unsigned char / signed char 浮点型(实型):用来保存小数 单精度浮点型: float 占4字节 双精度浮点型: double 占8字节 long double 占16字节(64位) 格式说明 由“%” + 格式符号 d --> 整型 ld --> 长整型 o --> 8进制 u --> 无符号整型 c --> 字符(单) s --> 字符串 f --> 实数 (2)构造类型: 需要我们自己去定义 数组: 数据类型 数组名[数组元素个数] 结构体 共用体 枚举 (3)指针类型 (4)空类型 void void 在C语言有三个地方会用 1、void func() { } 作为函数的返回值 2、int main(void) { } 作为函数参数,代表函数不需要参数,可省略 3、void * 通用指针类型 C语言中 数据 按照是否可以被修改(是否可写)分为两种: 不可修改: 常量 可被修改: 变量 2、常量 在程序在运行的过程中,不可以改变它的值。 常量也分为多类: (1)整型的常量 在代码中的一个体现 由一串数字组成(整数) 以0开头的,默认就是八进制: 0[0-7][0-7]..... 0123 0145 0789 //不是一个8进制 以0x/0X开头的,默认位十六进制:0x[0-9a-f][0-9a-f]... 0xa 0xf 0x12 ... 其他的就是十进制 123 没有后缀,默认int 123l 有后缀l,就是long 为什么没有二进制? 二进制写起来太长了,其次就是转换起来简单 0 1 2 3 01 010 011 01 111 111 101 01 7 7 5 0x 1 2 3 0001 0010 0011 0110 1100 1101 1111 转换成 八进制、十进制、十六进制 八进制:066337 十进制:6 * 8^4 + 6 * 8^3 + 3 * 8^2 + 3 * 8 + 7 = 27871 十六进制:0x6cdf (2)字符常量: 在C语言中用''引起来的一个或者多个字符序列 如 'a'、'3' 在计算机中保存的时候,不是字面上形状的保存 而是保存了对应字符的 ascii 码 ascii 码:把一个字符对应一个数字,该数字我们称为该字符的ascii码 Oct Dec Hex Char Oct Dec Hex Char ──────────────────────────────────────────────────────────────────────── 000 0 00 NUL '\0' (null character) 100 64 40 @ 001 1 01 SOH (start of heading) 101 65 41 A 002 2 02 STX (start of text) 102 66 42 B 003 3 03 ETX (end of text) 103 67 43 C 004 4 04 EOT (end of transmission) 104 68 44 D 005 5 05 ENQ (enquiry) 105 69 45 E 006 6 06 ACK (acknowledge) 106 70 46 F 007 7 07 BEL '\a' (bell) 107 71 47 G 010 8 08 BS '\b' (backspace) 110 72 48 H 011 9 09 HT '\t' (horizontal tab) 111 73 49 I 012 10 0A LF '\n' (new line) 112 74 4A J 101 65 41 A 141 97 61 a 060 48 30 0 字符:分为两种 普通字符:在打印的时候是可以显示形状的字符 printf("%c\n",'A'); 转义字符:打印的时候没有形状,但是有特殊的含义 '\t' --> 制表符(tab) '\n' --> 换行 '\0' --> 字符串结束符,空字符 '\***':由'\'后面接一个、两个或者三个八进制数组成 这些八进制的数字用来指定一个所期望的字符 '\107' --> 'G' '\x**':由'\x'后面接一个或者两个十六进制数组成 这些十六进制的数字用来指定一个所期望的字符 '\x41' --> 'A' (3)浮点常量 后缀可以是 f/F l/L f/F --> float l/L --> long double 如果没有后缀,默认它是double C语言中小数默认都是double 1.23f --> float 1.23 --> double 0.12 .12 整数部分为0可以省略 12.0 12. 小数部分为0可以省略 科学计数法: 由整数部分,小数点,小数部分,一个e/E,一个可选带符号的整型 1234.5678 --> 1.2345678 * 10^3 --> 1.2345678e3 0.001234 --> 1.234 * 10^-3 --> 1.234E-3 (4)枚举常量(后面解释) (5)符号常量 #define N 3.14 如果使用N,自动替换成 3.14 为了修改方便,并且不会改变其他的实际需要用的数值 Day2 一、变量 定义:在程序运行期间,它的值可以被改变,被修改。 变量会对应一个可写可读的内存单元。 内存单元由变量的类型来决定。 定义格式: 数据类型 变量名(=变量的初始值) Int b=5;定义时才叫初始化。 二、c语言标识符 定义:只能由数字,字母,下划线组成,不能由数字开头 不支持如%,*,& 不能使用c语言内部标识符 三、变量属性 1.数据类型:任意C语言的数据类型 2.变量名:必须符合C语言标识符的规定,且不能是C语言的关键字 3.变量内存单元:用来保存变量数据的存储空间,这个存储空间会有一个地址(编号) 4.变量的值:内存单元里放的内容 四、变量可代表的意思 1.代表变量的值:右值----->pringtf("%d\n",a); 2.代表变量的内存单元:左值----->变量的地址 五、整数存储方式 整数在计算机内以二进制补码存储 原码即数据转化为二进制 6: 0000 0000 0000 0000 0000 0000 0000 0110 补码: 正数补码是原码 负数补码是它的绝对值的原码取反加一 -6:1111 1111 1111 1111 1111 1111 1001--->取反 1111 1111 1111 1111 1111 1111 1001--->加一 4294967290: 和-6补码一样 printf("%d\n", -6); printf("%u\n", -6); 六、Int 有符号整形 最高bit位是符号 其它bit位是数据 总结:42944967290 + 6 = 4294967296=2^32 七、浮点数存储方法 符号位 指数位 科学计数小数部分 0/1 1bit 符号由127中间节点控制 0~255 8bit 23bit 空余位在后边补0 以12.5进行分析 1.转换成二进制是什么 1100.1 1 * 2^-1 = 1/2 = 0.5 2.变为科学计数(方法和十进制一样) 1.1001 * 2^3 八、整数之间赋值问题 int a = -6; //sizeof(a) <=> sizeof(int0 = 4 short int b = 100; short int c = 200; b = c;//相同类型数据进行赋值 类型相互兼容两个数据相互赋值 b = a; 长给短赋值 a会多一部分 a = b; 短给长赋值 空余一部分 (1)长给短赋值 低位直接拷贝copy ,高位 直接扔了 int a =123888;32位 //0...0 0001 1110 0011 1111 0000 short b = a; 8位 //1110 0011 1111 0000 hd 有符号短整型 hu 无符号短整型 printf("%hd\n",b); //-7184 0001 1100 0001 0000 printf("%hu\n",b); //58352 练习: int a = 360; // 0001 0110 1000 char c = a; // 0110 1000 --> 104 printf("%c",c); // -->'h' 溢出: char c = 358; //0001 0110 0110 c 只有一个字节 8 bit 超出的bit位 直接舍弃 c // 0110 0110 --> 'f' (2)短给长赋值 分情况讨论 对于短数据是有符号,长数据高位全部补符号位(短数据) short a = 12; int b = -4; b = a; //补 a 的符号位 对于短数据是无符号,长数据高位全部补0 ------------------------------------------ int a = -6; short b = -100; sizeof(b) = 2 //-100(原码):1000 0000 0110 0100 //100(原码) :0000 0000 0110 0100 //取反:1111 1111 1001 1011 //加1:1111 1111 1001 1100 a=b; //短给长,有符号,前面补符号位。 //a:1....1 1111 1111 1001 1100 printf("%d\n",a);-100 //打印原码对应的值 负数补码-1取反(最高bit位不变) //10...0 0110 0100 -100 printf("%u\n",a); //a(补) = 1...1 1111 1111 1001 1100 //2^32-100 = 4294967196 ------------------------------------- int a = -6; unsigned short b = -100; //-100(原码)1000 0000 0110 0100 //100(原码)0000 0000 0110 0100 //取反:1111 1111 1001 1011 //+1: 1111 1111 1001 1100 (-100的补码) a = b; // a(补) = 0...0(无符号前面补0) 1111 1111 1001 1100 printf("%d\n",a); // a(原) = 0...0 1111 1111 1001 1100 printf("%u\n",a); // a(原) = 0...0 1111 1111 1001 1100 练习 printf("%d\n",-1); // 默认 int // -1(原) 1...0 0001 // 取反 1...1 1110 // 加1 1....1 1111 //打印原码对应的值 负数补码-1取反(最高bit位不变) // 有符号整型打印 -1 printf("%u\n",-1); // 默认 int // 1111...1111 // 无符号整型打印 2^32 - 1 printf("%d\n",-1u); // -1(补) 1111...1111 // -1u(无符号-补) 1111...1111 // 有符号整型打印 -1 printf("%u\n",-1u); // -1(补) 1111...1111 // -1u(无-补) 1111...1111 // 无符号整型打印 2^32 - 1 printf("%d\n",(char)-1);// (char)-1 1111 1111 // -1(补) 1111...1111 // (char)-1(补) 1111 1111 // 有符号打印,短->长 8bit->32bit 补符号位 // 1111...1111 // 有符号整型打印-1 printf("%u\n",(char)-1); // (char)-1(补) 1111 1111 // 8bit --> 32bit 有符号 // 1111...1111 // 无符号整型打印 2^32 - 1 printf("%d\n",(unsigned char)-1); // -1(补) 1111...1111 // (unsigned char)-1 1111 1111 // 有符号整型打印 短变长 无符号型加0 0000...0000 1111 1111 ---> 255 printf("%u\n",(unsigned char)-1); // -1(补) 1111...1111 // (unsigned char)-1 1111 1111 // 无符号整型打印 短变长 无符号型加0 0000...0000 1111 1111 ---> 255 printf("%d\n",(char)255); // 255(补) 000...000 1111 1111 // (char)255(补) 1111 1111 // 短变长 11...11 1111 1111 //有符号整型打印-1 打印原码对应的值 负数补码-1取反(最高bit位不变) printf("%u\n",(char)255); // 255(补) 000...000 1111 1111 // (char)255(补) 1111 1111 // 短变长 11...11 1111 1111 // 无符号整型打印 2^32 - 1 printf("%d\n",(unsigned char)255); // 255(补) 000...000 1111 1111 // (unsigned char)255(补) 1111 1111 // 短变长 无符号型加0 0000...0000 1111 1111 ---> 255 // 有符号整型打印255
创建帐户或登录后发表意见