c语言操作符难点详解1——除取模,左移,右移操作符

目录

算术操作符

移位操作符


算术操作符

+  -  *  / %  

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int a = 3 / 5;
	printf("%d", a);
	return 0;
}

大家简单看一下这段代码

正常算出来3/5=0.6

但是,大家看清楚结果

 计算机执行的是整数除法,a算出来是商0余3,在这里就是商 

有人想得到小数     那么就会有人这样改了  注意这样改是错的

如果你想要得到小数,那么需要把除数或者被除数期中一个改成小数

 当然把3改成3.0其实也是可以的,但是这样写会在编译器下面看到警告

 你也可以这样改

 这样即可

再来聊一下取模

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int a = 7 % 3;
	printf("%d", a);
	return 0;
}

7%3就是7/3算出来的余数,7/3算出来应该是商2模1,所以这里算出来的应该是1

 但是取模操作只适用于整数如果改为小数或者0编译器即会报错 

移位操作符

<<左移操作符    >>右移操作符

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int a = 2;
	int b = a << 1;
	printf("%d", b);
	return 0;
}

   如果你想了解清楚这段代码,需要了解唯一操作符

这个操作符其实表示把a的二进制位向左移动一位

1byte(字节) =8bit

整形在内存中占四个字节,也就是32个bit位

那么a的二进制位为

 移动后应该为这样

 那么左边的0就会被丢弃,右边空的一个位就补0

 这样1就向左移动了一位,所以b就变成了1*2^2 =4

 <<操作符,左边丢弃,右边补0

接下来是右移操作符

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int a = 10;
	int b = a >> 1;
	printf("%d", b);
	return 0;
}

把a的二进制位向右移动一位

a的二进制序列位

 向右移动一位

 这里就有些讲究了,计算机内存中最高位如果是0代表正数如果是1表示负数

这里右移操作符分为两种

1、算数右移    右边丢弃,左边补原符号位

2、逻辑右移    右边丢弃,左边补0

当然在这里如果是算数右移,因为是正数,所以左边补0

这里算出来应该是5

当然这里如果你想测试这个编译器是算数右移和还是逻辑右移是测不出来的,这里需要一个负数来测试

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int a = -1;
	int b = a >> 1;
	printf("%d", b);
	return 0;
}

 这里需要补充一点知识,整数在二进制里储存的方式

原码,反码,补码

原码:直接根据数值直接写出的二进制序列

反码:符号位不变,其他位按位取反

补码:反码+1就是补码

-1放入内存中为补码

原码为

第一位1表示负数

反码为 11111111111111111111111111111110

补码为 11111111111111111111111111111111

向右移动后

 如果是算数右移应该为11111111111111111111111111111111  也就是-1

如果是逻辑右移应该为01111111111111111111111111111111   应该是个正数

说明当前右移操作符使用的是算数右移 

警告:对于移位操作符不允许移动负数

了解了这么多来看一道题目考验一下自己吧

 内存中储存32位数也就是32个bit位,也就是4个字节

如果这个二进制位表示的是一个Int型,那么数字应该为

 这里可以看到(DEC为十进制),将这个直接转化为一个整形,答案就为a选项

当这段二进制表示为short型时,一个short占用两个字节,也就是将这段二进制分成两段,一段16个字节

 

字符型和浮点型还没具体谈到,这里就简单了解一下就行了,后续会专门写几篇关于数据在内存中储存的方式

当这段二进制表示为char型时,每个char型是一个字节,也就是8个bit位

 那么转化为十进制分别为103    108    111  98

这里附上ASCII表ASCII

用ASCII值表示应该为glob

根据规定,所有的浮点数都可以表示为(-1)^s*M*2^E

(-1)^s表符号位 s=0时数字为正,s=1时数字为负

m表示有效数字  >1&&<2

2^E表示指数位

这里32个bit位分别给到每个字节具体应该为

 

这里就题论题 第一个0表示正数  后续八个bit位存放指数

指数有些复杂,在存放时指数转化为二进制然后再加上中间值(127)再存入,也就是说这里的二进制需要-127再还原成真正的指数

这里后八位转化为十进制为

206    206-127= 79  也就是2^79

小数部分为1.1011000110111101100010

1.1011000110111101100010*2^79 将这个数转化为十进制即为结果(数字太大了,计算器算不了)

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值