第三天:c基础2

本文介绍了C语言中的变量命名规范,包括变量的声明和初始化。讨论了类型转换,如uint、ushort、int之间的转换以及浮点数到整数的转换。还涉及了原码、反码和补码的概念,以及在计算机中如何存储和运算。此外,提到了变量越界问题和输入输出函数printf及scanf的使用,包括格式化输出和输入的处理方法。
摘要由CSDN通过智能技术生成

day3

变量

变量的命名规则

  • 由数字、字母和下划线构成
  • 不能以数字开头
  • 严格区分大小写
  • 不能和C语言的32个关键字重复

变量的声明

int a;
printf("%d\n",a);  // 随机数
int n1 = 10;
printf("%d\n",n1);  // 10
a = 100;
printf("%d\n",a);  // 100
n1 = a;
printf("%d\n",n1);  // 100
int n2 = n1;
printf("%d\n",n2);  // 100

类型转换

uint a = 0xFFFFFFFF;
ushort b = a;
printf("a=%#x,b=%#x\n", a, b);  // a=0xffffffff,b=0xffff
ushort c = 0xFFFF;
uint d = c;
printf("c=%#x,d=%#x\n", c, d);  // c=0xffff,d=0xffff
float e = 1.111;
int f = (int)e;
printf("e=%f,f=%d\n", e, f);  // e=1.111000,f=1
unsigned int c = 2;  //无符号数
signed int a = -3;   //有符号数
printf("%u\n",a+c); //隐式的强制类型转换,无符号数和有符号数一起运算,强转成无符号数

原码、反码和补码

计算机中,数据都是以补码的形式进行存储和运算。

TIP:原码、反码和补码都是二进制表示的

  • 原码:人能看懂的,十进制转换过来的
  • 反码:原码和补码的一个中间状态 ,正数原码、反码和补码都一样,负数,原码的除符号位外其他位取反
  • 补码:计算机中存储和运算用的都是补码,正数原码、反码和补码都一样,负数的补码是反码+1
  • 正数的原反补都相同
  • 负数的反码是原码除符号位外取反,补码是反码+1

变量越界

char a = 213;
char b = a;
printf("%d", b);
int i = g + h;
uint j = g + h;
printf("i:%d,j:%#x\n", i, j); // i:-1,j:0xffffffff

输入输出

printf

int printf(const char *format, ...);
// printf("占位符/格式符",输出表象);
printf("%d\n", 10);  // 10

转义字符

字符含义说明
\n换行ASCII:10
\t制表符一个tab键的大小4个空格
\b退格回退一个字符
\r回车回退到行首进行输出
\\反斜杠输出一个\

格式符

格式符说明
%d整形数据的格式符
%-ndn个数据宽度左对齐输出,不够就补空格
%ndn个数据宽度右对齐输出,不够就补空格
%ld长整型数据的格式符
%f浮点型的格式符,printf默认输出小数点后6位
%.mf指定小数点后的输出位数
%lf双精度浮点型的格式符
%c字符型的格式符
%s字符串的格式符
%#x输出十六进制,并且带前导符0x,小写x,输出十六进制时都是小写的
%#X输出十六进制,并且带前导符0X,大写X,输出十六进制时都是大写的
%%输出一个%
%u无符号数输出的格式符

scanf

垃圾字符回收

int scanf(const char *format, ...);
// scanf("格式符",变量的地址);
// &:取地址符,取变量的地址
char *a = malloc(1);
char *b = malloc(1);
// 1. 严格控制
scanf("%c,%c", a, b);
printf("a=%c,b=%c\n", *a, *b);
// 2. 分开获取
scanf(" %c", a);
scanf(" %c", b);
printf("a=%c,b=%c\n", *a, *b);
// 3. 获取字符函数:getchar()
getchar();
scanf("%c", a);
getchar();
scanf("%c", b);
printf("a=%c,b=%c\n", *a, *b);
// 4. 舍弃:%*c
scanf("%*c%c%*c%c", a, b);
printf("a=%c,b=%c\n", *a, *b);

题目

  1. 整理思维导图

  2. 有以下变量求输出结果,并写出数据存储和取出的过程

signed char c = 178;
printf("%d\n",c);
printf("%u\n",c);
unsigned char d = -9;
printf("%d\n",d);
printf("%u\n",d);
#include <stdio.h>

int main() {
    signed char c = 178;
    // c变量存储:
    // 源码=1011 0010
    // 反码=1011 0010
    // 补码=1011 0010

    // 取出来,准备进函数:
    // 补码=1011 0010
    // 反码=1011 0001
    // 源码=1100 1110
    // 放进printf
    printf("%d\n", c);
    // 函数中,局部变量存储:
    // 源码=1000 0000 0000 0000 0000 0000 0100 1110
    // 反码=1111 1111 1111 1111 1111 1111 1011 0001
    // 补码=1111 1111 1111 1111 1111 1111 1011 0010
    // 函数中取:
    // 补码=1111 1111 1111 1111 1111 1111 1011 0010
    // 反码=1111 1111 1111 1111 1111 1111 1011 0001
    // 源码=1000 0000 0000 0000 0000 0000 0100 1110
    // 输出:-78
    printf("%u\n", c);
    // 函数中,局部变量存储:
    // 源码=1000 0000 0000 0000 0000 0000 0100 1110
    // 反码=1111 1111 1111 1111 1111 1111 1011 0001
    // 补码=1111 1111 1111 1111 1111 1111 1011 0010
    // 函数中取:
    // 无符号时 c源码 = c补码 = 4,294,967,218
    unsigned char d = -9;
    // c变量存储:
    // 源码=1000 1001
    // 反码=1111 0110
    // 补码=1111 0111
    // 取出来,准备进函数:
    // d无符号: 源码 = 补码 = 1111 0111
    // 放进printf
    printf("%d\n", d);
    // 函数中,局部变量存储:
    // 补码 = 源码 = 0000 0000 0000 0000 0000 0000 1111 0111
    // 函数中取:
    // 源码 = 补码 = 0000 0000 0000 0000 0000 0000 1111 0111
    // 输出:247
    printf("%u\n", d);
    // 函数中,局部变量存储:
    // 补码 = 源码 = 0000 0000 0000 0000 0000 0000 1111 0111
    // 函数中取:
    // 源码 = 补码 = 0000 0000 0000 0000 0000 0000 1111 0111
    // 输出:247
}
  1. 求-57的原码、反码和补码

原码:10111001

反码:1100 0110

补码:1100 0111

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值