C语言 | chap2 有无符号数据类型

一、整型

  • 整型就是C语言中保存正数的类型
  • C语言中共有8种整型,根据有无符号可分为
  • 有符号:short、int、long、long long
  • 无符号:unsigned short、unsigned int、unsigned long、unsigned long long
  • printf("short = %d\n", sizeof(short)); //2
    printf("int = %d\n", sizeof(int)); // 4
    printf("long = %d\n", sizeof(long)); // 4
    printf("long long = %d\n", sizeof(long long)); //8
    printf("unsigned short = %d\n", sizeof(unsigned short));
    printf("unsigned int = %d\n", sizeof(unsigned int));
    printf("unsigned long = %d\n", sizeof(unsigned long));
    printf("unsigned long long = %d\n", sizeof(unsigned long long));
    

C语言标准中并没有明确的给出每种整型的字节数,只是给出了一种大小关系
sizeof(short)<=sizeof(int)<=sizeof(long)<=sizeof(long long)

1.1无符号整型

  • Unsigned short:2字节(0~2^16-1)
  • Unsigned int:4字节(0~2^32-1)
  • Unsigned long:4字节(0~2^32-1)
  • Unsigned long long:8字节(0~2^64-1)

1.1.1无符号整型的存储

  • Unsigned short age = 17;

  • 17(十进制)->10001(二进制)->0000 0000 0001 0001(高位补零)

  • 存储规则:将要保存的正整数转换为二进制,高位补零后直接存储。

  • Unsigned short 最大值的二进制
    1111 1111 1111 1111(65535)

  • Unsigned short 最小值的二进制
    0000 0000 0000 0000(0)

1.1.2无符号整型的溢出问题

unsigned short a = 65535;
printf("%hu\n", a); // 65535
//    1111 1111 1111 1111
a = a + 1;
// 1 0000 0000 0000 0000
printf("%hu\n", a); // 0
// 0000 0000 0000 0000
a = a - 1;
// 1111 1111 1111 1111 (-1补码)
printf("%hu\n", a); // 65535

1.2有符号整型

  • short:2字节(-215~215-1)
  • int:4字节(-231~231-1)
  • long:4字节(-231~231-1)
  • Long long:8字节(-263~263-1)

1.2.1有符号整型的存储

  • 有符号整型就是包含正整数、负整数、0的类型
  • 存储规则:
    • 正整数:直接转换为二进制,高位补零,最高位为0,代表符号位
      • 正整数的原反补一样
    • 负整数:有双0 取正0就可以 负0的状态位留出来
      • 原码:绝对值转二进制,最高位补零,符号位为1

        Short a = -10;
        1 000 0000 0000 1010

      • 反码:原码按位取反 符号位不变,数据位按位取反
        1 111 1111 1111 0101

      • 补码:反码+1 (存在意义:不必使计算机使用减法器 直接使用加法器可以实现减法运算)
        1 111 1111 1111 0110(-10内存中的存储形式)

      • 补充:计算机内是以二进制进行数据存储,以补码形式

      • E.g.:

        	18 - 18 -> 18 + -18
        	18的补码:0 000 0000 0001 0010
        	-18的原码:1 000 0000 0001 0010
        	-18的反码:1 111 1111 1110 1101
        	-18的补码:1 111 1111 1110 1110
        	----------------------------------	
        	180 000 0000 0001 0010
        	+ -181 111 1111 1110 1110
        	-----------------------------
        	0 000 0000 0000 0000
        
      • 假设:有一种十进制的电脑,有一种整型能存储2位十进制数
        21 - 11

        = 21 - 11 + 100 - 100 (数学上成立)

        = 21 - 11 + 99 + 1 -100

        = 21 - 11 + 99 + 1 (接合假设,成立)

        = 21 + (99-11+1)

        = 21 + 89

        = 110

        = 10

1.2.2有符号整型的溢出问题

int a = INT_MAX;
printf("%d\n", a); // 2147483647
// 0 111 1111 .... 1111 1111
// +1
// 1 000 0000 .... 0000 0000
a = a + 1;
printf("%d\n", a); // -2147483648
a = a - 1;
// 1 000 0000 .... 0000 0000
// -1
// 0 111 1111 .... 1111 1111
// -------------------------
// 1 000 0000 .... 0000 0000
//+1 111 1111 .... 1111 1111
// 0 111 1111 .... 1111 1111
printf("%d\n", a); // 2147483647

二、字符型

  • Char 保存单个英文字符的类型
  • 1个字节
  • Char 在存储时,存储的是ASCII码(读阿斯克 使用1个字节)数字,可以将char类型当作最短的整型
    • 中国字符编码器 GB2312
    • Unicode(用四个字节) 编码方式涵盖全世界各种语言 utf-8是Unicode实现的一种方式 每个字符最小位数是8位
    • 	char c = 'a';
      	char d = 97;
      	printf("%c\n", c); // a
      	printf("%d\n", c); // 97
      	printf("%c\n", d); // a
      	printf("%d\n", d); // 97
      
    • 此处参照Ascii码表
      在这里插入图片描述
  • 有一些字符无法直接进行表示,需要采用转义字符的形式
    • ':单引号
    • ":双引号
    • \: 反斜杠
    • \t:制表位
    • \n:换行
  • ASCII码表在表示字母及数字字符时是连续表示的。
		char c = 'e';
		char d = 'T';
		c = c - ('a'-'A');
		printf("%c\n", c); // E
		d = d - ('A'-'a');   \\  当记不住大小写之间相差多少时可以这样写 :要大写时 就字母本身减去用大写减去小写的值;写小写时,减去用小写减去大写的值
		printf("%c\n", d); // t
		if ('a' <= d && d <= 'z')
		{
			printf("小写\n");
		}else{
			printf("非小写\n");
		}

三、实型(浮点数类型)

  • 保存小数的类型
    • float:单精度浮点数类型 (4字节)
    • double:双精度浮点数类型 (8字节)
    • Long double:长双精度浮点数类型 (8字节)
    • C语言没有明确给出各种类型的字节数,只是给出了大小关系
      • sizeof(float)<=sizeof(double)<=sizeof(long double)
  • 浮点数的存储
    • 十进制的小数转化成二进制极大概率转换不尽
    • 浮点数在存储的时候只是近似存储,无法进行精确存储,主要原因是 尾码要进行截断
    • 浮点数存储包括 符号位、阶码、尾码 三个部分
      • E.g.:float a = 4.25;
      • Float :符号位(1位)、阶码(8位)、尾码(23位) //阶码尾码越长代表 可存储数据越精确
        1) 4.25(十进制)-> 100.01(二进制)
        2) 1000.01 -> 1.00001 *2^3 科学计数法形式 可存储24位
        3) 阶码:3 + 127 (移码) = 130 =1000 0010
        4) 尾码:00001 0000 0000 0000 0000 00 位数不够在后面补零
        5) 0 1000 0010 0000 1000 0000 0000 0000 000
        • tips:判断小数是否相等 不能直接判断 要判断之间的差值与误差 大小关系
    • Float a = 2.45
    • Float a = 0.35
    • Float a = 2.1

四、常量与字面值

4.1常量

  • Const 变量:只读变量,常变量(常量)
  • 在定义变量的时候,前面加上const,表示这个变量不可以被修改
  • 常量(const 变量)必须在定义时进行初始化 ,否则该变量就没有存在意义 (不能被修改,也没有被赋值)

4.2字面值

  • 整型字面值

    • 10、123、-1000
    • 整型字面值默认数据类型时int
    • 可以通过增加后缀的方式修改字面值类型
      • U或u :unsigned 123u
      • L或l :long 123L
      • LL或ll :long long 123LL
    • 可以使用八进制或者十六进制形式表示整型字面值
      • 八进制:增加前缀0,表示八进制数 011
      • 十六进制:增加前缀0x,表示十六进制数 0x11
        • 形式已经确定 八进制就是0+两个数字;十六进制就是0x两个数字
      • 例题: 在这里插入图片描述
  • 实型字面值(浮点数类型字面值)

    • 3.14、1.0、100.11
    • 小数字面值默认数据类型时double
    • 可以通过增加后缀的方式更改小数的类型:
      • F或f:float 3.14f
      • L或l:long double 3.14l
    • 通过科学计数法形式表示
      • 1e-5、1.2E3
        • 1e-5是C语言中一种计数形式,1表示尾数,e表示阶码标志,-5表示阶码。
        • 1e-5表示1*10^-5
    • 如果小数点前面是0,可以省略小数点前面的0
      • 0.123 -> .123
  • 字符型字面值

    • 字符型字面值默认类型是char
    • 表示形式是单引号引起来
      • ‘0’ :字符0字面值
      • 0:整型0字面值
    • 无法直接表示的字符可以通过转义字符来表示
      • \n、\t、\、’、"、\0(结束字符,计算机自动添加)
      • 以3位八进制数形式进行转义
        • \ddd形式,ddd表示三位八进制数对应ASCII码字符
        • \061 :061(八进制) -> 49(十进制)-> 对应ASCII码‘1’
      • 以2位十六进制数形式进行转义
        • \xhh 形式,hh表示两位十六进制数对应ASCII码字符
        • \x61 :61 (十六进制)-> 97(十进制)-> 对应ASCII码‘a’
      • 不管是2位十六进制还是3位八进制,该字符的形式始终是:\xxx (即反斜杠加上三个元素)
    • 总结:字符有三种
      • 不是符号但可以直接输入的、
      • 转义字符表示符号型的
      • 八进制和十六进制转义的
  • 字符串字面值

    • “hello”、“abcd”、“123456”
    • c语言中通过双引号来表示字符串字面值
    • 字符串字面值在存储时会自动在末尾加上一个结束符 :\0
    • 字符串长度
      • 字符串中第一个\0之前字符的个数
      • eg:“hello world” 长度为:11
      • eg: “12345\0abcd”长度为:5 (第一个\0前面字符的个数)
      • eg: “0\123\0123" 长度为:5 × 4 √(根据转义符三位八进制数的形式\123算一个字符;\0和\012之间\012优先)
      • eg: "0\123\\0000123“ 长度为:3(0一个,\123一个,\一个,\000算是\0所以只有3)
    • 字符串字符个数
      • 字符串中一共有多少个字符
      • eg:“hello world”:个数为:12 (还有一个\0
      • eg: “12345\0abcd”个数为:12× 11√ (\0算一个字符)
      • eg: “0\123\0123” 个数为:5 (\0和\012之间\012优先
      • eg: “0\123\\0000123” 个数为:9
    • 两(多)个相邻的字符串字面值会默认进行拼接
      • eg:printf(“asdfgdfgf” “dagfdghasdg” “agdsghfs”);

五、数据的输入输出

  • C语言标准本身并不提供输入输出功能,想要使用输入输出功能需要引入”标准输入输出库“(stdio.h)
  • C语言常用输入输出函数
    • 格式化输入输出:scanf()、printf()
    • 字符串输入输出:getchar()、putchar()
    • 字符串输入输出:gets()、puts()

5.1printf格式化输出

  • 函数作用:将要输出的数据按照给定格式进行输出
  • 一般形式:printf(格式化字符串,参数2,参数3…)
  • printf支持1N个参数,它会将2N个参数按照参数1的要求填充到参数1中,并进行输出
    • printf("%d +%d = %d\n",1,2,3);
    • printf(“%d\n”,3.14);//0
    • printf(“%f\n”,314);//0.000000
  • 常见的格式转换说明符
    • %d(int)、%u(unsigned int)、%f(float/double)、%c(char)、%s(字符串)
  • 可以通过长度修正说明符来进行长度修正
    • %hd(short)、%hu(unsigned short)、%ld(long)、%lu(unsigned long)、%lld(long long)、%llu(unsigned long long)、%lf(long double)
  • 整型八进制及十六进制格式转换说明符
    • %o(int输出为八进制) 、 %x(int输出为十六进制)
  • 需要使用右对齐时可以使用最小宽度说明符
    • 指定要输出的数据最少占用多少个字符的位置,如果真实数据没有这么多位,则高位补空格
    • printf(“%7d\n”,9600);
    • printf(“%7d\n”,960000);
    • printf(“%7d\n”,90600);
    • printf(“%7d\n”,96000000);
  • 小数的精度说明符
    • 在输出数据时,小数点后面保留多少位
    • 最小精度说明符在打印截断时会四舍五入
    • Printf("%.2f\n",3.14); ->3.14
    • Printf("%.2f\n",3.145); ->3.15
  • 一定要保证输出书库类型与格式转换说明符类型保持一致

5.1.1 课后补充

在这里插入图片描述

5.2 scanf格式化输入

  • 函数作用:按照指定格式从输入数据中获取指定数据 (py中函数调用本质是值传递)
  • 一般形式:scanf(格式化字符串,参数2,参数3…);
    • 第2~N个参数必须是变量的地址
    • C语言中可以通过&获取变量地址
      Int a,b;
      scanf(“%d %d”,&a,&b);
      Printf(“%d %d \n”,a,b)
  • 数据真实输入格式一定要与格式化字符串格式保持一致;(eg在上面
    • scanf(“%d %d\n”,&a,&b);
  • scanf无法匹配\n,会直接跳过换行、空格、制表符,则无法正确读取数值; (eg在上面
  • scanf和printf大部分格式转换说明符是一样的
    • double:printf中用%f,scanf中用%lf
  • eg:输入圆的半径和Π(pai)的值,输出其面积和周长 小数点后面保留2位
    		double r, pai;
    		printf("请输入圆的半径r和π,使用空格隔开:\n");
    		scanf("%lf %lf", &r, &pai);
    		printf("面积为%.2f\n", pai * r * r);
    		printf("周长为%.2f\n", 2 * pai * r)

5.3 getchar 和 putchar

  • getchar:读取一个字符

  • putchar:输出一个字符

    • char c1,c2,c3;
      C1 = getchar();
      C2 = getchar();
      C3 = getchar();
       
      Putchar(c1);
      Putchar(c2);
      Putchar(c3);
      ->ABAB
      
  • getchar不会跳过任何一个字符,包括换行符、空格符等,会依次读取每一个字节,putchar也一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑眼圈子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值