C语言DAY2

3、变量:在程序运行期间,它的值可改变、被修改 。
变量会对应的一个可读可写的内存单元
int a;
char c;
float b;
a,b,c 都是变量
变量用来保存数据,既然需要保存数据,是不是得有地方储存(内存空间)
这个内存空间需要多大?
需要根据这个变量的类型的类型来决定的。 所以,我们定义变量的时候,就需要指定好类型。
变量的定义格式:数据类型 变量名 [= 变量的初始值];
int a; 定义了一个变量,它的名字是 a ,int 变量。没有初始值,是一个随机的数值 int b = 5; //只有在定义的时候给数据才叫初始化 。定义了一个变量,它的名字是 b ,int 变量。赋了初始值5
char c;
c = 45;
float f;
C语言标识符:只能由数字、字母、下划线组成,并且不能由数字开头。
% * & …不支持
int a*a; //错误
为了避免产生歧义,还有不能使用C语言内部标识符。
变量属性:
数据类型 :任意的C语言数据类型
变量名:必须符合c语言标识符的规定,且不能是C语言关键字
变量的内存单元:用来保存这个变量数据的存储空间,这个存储空间会有一个地址(编号) 变量的值:变量的内存单元里面的内容 对变量的访问:
int a = 100;//1
int b; //2
b = a; //a的值给b //3
a = 150; //把100覆盖 //4
printf("%d\n",a);
在C语言任何的变量都有2个意思:
1、代表变量的值: 右值 a第二种情况、a第四种情况
2、代表变量的内存单元(变量的地址) : 左值 a的第一种情况、a的第三种情况 试一下:“%d”打印一个小数
不可以打印小数,%d是打印十进制有符号的整数。要打印小数应该用%f
4、整数(char)的存储方式:整数在计算机内中以二进制的补码存储
原码:把整数换成二进制就好了
6 :0000 0000 0000 0000 0000 0000 0000 0110
补码:正数的补码就是原码
6 :0000 0000 0000 0000 0000 0000 0000 0110
负数的补码是它的绝对值 的原码 取反 +1 -6 :绝对值 的原码取反: 1111 1111 1111 1111 1111 1111 1111 1001
+1:1111 1111 1111 1111 1111 1111 1111 1010
练习一下:求一下1234和-1234的补码 1024 + 128 + 64 + 16 + 2
1234:0000 0000 0000 0000 0000 0100 1101 0010
-1234:绝对值原码取反:1111 1111 1111 1111 1111 1011 0010 1101
+1:1111 1111 1111 1111 1111 1011 0010 1110
4294967289的补码:1111 1111 1111 1111 1111 1111 1111 1001 4294967290的补码:1111 1111 1111 1111 1111 1111 1111 1010
和-6的补码一样?是不是说明他们在内存的存储形式是一样的呢? 如果内存中存了1111 1111 1111 1111 1111 1111 1111 1010 那么它代表那个数?-6,4294967290?
printf("%d",-6);
printf("%u",-6);
int 有符号整型 最高bit位是符号 0为正 1为负 其他bit位是数据
1111 1111 1111 1111 1111 1111 1111 1010 是有符号的数据,意味是一个负数 得到它的本身的值
负数求补码的操作反过来-1: 1111 1111 1111 1111 1111 1111 1111 1001
取反:0000 0000 0000 0000 0000 0000 0000 0110 --> 6 -6 unsigned int 无符号整型,所有bit位都是数据 以上规则是人定的,计算机是没有这个概念的,到底怎么处理就得看编译器的词义。 4294967290 + 6 = 4294967296 = 2^32 4294967289 + 7 = 4294967296 浮点数存储方式 :
以 12.5 float分析转换成二进制是什么 1100.1 1 * 2^-1 = 1/2 = 0.5
变为科学计数(方法和十进制一样) 1.1001 * 2^3
有三部分需要保存好 不需要保存小数点左边的,因为全是1符号位 ,1bit 指数位,8bit 符号由127中间节点控制 0~255
科学计数小数部分 23bit 空余位在后边补0 0.125 转换位二进制科学计数 1 * 2^-3 指数位 : 127 + 指数值
5、整数之间赋值问题 int a = -6; //sizeof(a) <=> sizeof(int) = 4 short int b = 100;
short int c = 200;
b = c; //相同类型数据进行赋值
类型相互兼容两个数据相互赋值 b = a; 长给短赋值 a会多一部分 a = b;
短给长赋值 空余一部分
(1)长给短赋值
低位直接拷贝copy ,高位 直接扔了
int a = 123888; //0…0 0001 1110 0011 1111 0000
short b = a; //1110 0011 1111 0000 hd 有符号短整型 hu 无符号短整型 printf("%hd\n",b); //-7184 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; // 01100100
a = b; // 0…0 0110 0100 printf("%d\n",a);
printf("%u\n",a);

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 (-100的补码) a = b;//短给长 有符号 前面补符号位 //a(补) = 1…1 1111 1111 1001 1100 printf("%d\n",a); // 打印原码对应的值 负数补码-1取反(最高bit位不变) //10…0 0110 0100
-100
printf("%u\n",a); // 2^32 - 100 = 4294967196
//a(补) = 1…1 1111 1111 1001 1100
//无符号 所有bit位都是数据 ------------------------------
int a = -6; // unsigned short b = -100; // b(补) = 1111 1111 1001 1100(无符号) //sizeof(b) = 2
//-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 1111 1111 1001 1100 printf("%d\n",a);
//a(原) = 00…0 1111 1111 1001 1100 65436
printf("%u\n",a); //a(原) = 00…0 1111 1111 1001 1100 65436 练习:
printf("%d\n",-1); // 默认 int
// 1111…1111
// 有符号整型打印 -1 printf("%u\n",-1); // 默认 int
// 1111…1111
// 无符号整型打印 2^32 - 1 printf("%d\n",-1u); //-1u unsigned -1
// -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); //-1(补) 1111…1111
//(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 // 有符号整型打印 0000…0000 1111 1111 —> 255
printf("%u\n",(unsigned char)-1); // -1(补) 1111…1111
// (unsigned char)-1 1111 1111 // 无符号整型打印 0000…0000 1111 1111 —> 255 printf("%d\n",(char)255);//255(补) 000…000 1111 1111
//(char)255(补) 1111 1111
// 11…11 1111 1111
// 有符号整型打印 -1
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 //000…000 1111 1111
// 有符号整型打印 255

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值