C语言操作符详解

目录

1.进制转换(二进制,八进制,十进制,十六进制)

 2.原码,反码,补码

3. 操作符的分类



 

1.进制转换(二进制,八进制,十进制,十六进制)

  1.  二进制转十进制                                                                                                                     二进制数与十进制转换中每一位有着相应的权重,从右向左依次是2^0,2^1,2^2,2^3……以此类推,而二进制转十进制,只用将对应数字乘以相应权重,再相加即可,例如:二进制数1101———对应十进制为1*2^0+0*2^1+1*2^2+1*2^3=11;     二级制数111000——对应十进制数为0*2^0+0*2^1+0*2^2+1*2^3+1*2^4+1*2^5=56;
  2.  十进制转二进制                                                                                                                      相反,十进制转换二进制采用相除的办法。例如十进制数125对应二进制数为1111101;
  3. 二进制转换为八进制                                                                                                                8进制的数字每⼀位是0~7的数字,各⾃写成2进制,最多有3个2进制位就⾜够了,⽐如7的⼆ 进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算⼀ 个8进制位,剩余不够3个2进制位的直接换算。                                     如:2进制的01101011,换成8进制:0153,0开头的数字,会被当做8进制。
  4. 二进制数转换为十六进制                                                                                                           16进制的数字每⼀位是0~9,a ~f 的数字,各⾃写成2进制,最多有4个2进制位就⾜够了, ⽐如 f 的⼆进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进 制位会换算⼀个16进制位,剩余不够4个⼆进制位的直接换算。                               如:2进制的01101011,换成16进制:0x6b,16进制表⽰的时候前⾯加0x进制

 2.原码,反码,补码

整数的2进制表示方法有三种,即原码、反码和补码

有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号 位,剩余的都是数值位。

符号位都是用0表示“正”,用1表示“负”。

正整数的原、反、补码都相同。

负整数的三种表示方法各不相同。

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码+1就得到补码。 反码得到原码也是可以使用:取反,+1的操作。

//      00000000000000000000000000001010   --   10的原码(int型)
//      00000000000000000000000000001010   --   10的反码
//      00000000000000000000000000001010   --   10的补码

//      10000000000000000000000000000011   --    -3的原码(int型)
//      11111111111111111111111111111100          --    -3的反码
//      11111111111111111111111111111101           --   -3的补码

         

3. 操作符的分类

• 算术操作符: + 、- 、* 、/ 、%

#include<stdio.h>
int main()
{
	int a,b,c;
	scanf("%d %d",&a,&b);
	c = a + b;//“+”两数相加
	printf("%d\n", c);
	c = a - b;//“-”两数相见
	printf("%d\n", c);
	c = a * b;//“*”两数相乘
	printf("%d\n", c); 
	c = a / b;//“/”两数相除
	printf("%d\n", c);
	c = a % b;//“%”两数取余(数)
	printf("%d\n", c);
	return 0;
}

• 移位操作符: >>   <<

位移操作数的操作符只能是整数

#include<stdio.h>
int main()
{
	int a = 10,num1,num2;
	//00000000000000000000000000001010   --10的原码
	//00000000000000000000000000001010   --10的反码
	//00000000000000000000000000001010   --10的补码
	num1 = a << 1;
	//00000000000000000000000000010100   --向左移动一位,左边删0,右边补0(这是10的补码左移动后的补码)
	//00000000000000000000000000010100   --正数的原反补码均相同,所以该原码对应10进制数为20
	num2 = a >> 1;
	//00000000000000000000000000000101   --向右移动一位,右边删一位,左边补原该值符号位(这是10的补码右移动后的补码)
	//00000000000000000000000000000101   --正数的原反补码均相同,所以该原码对应10进制数为5
	printf("%d %d", num1,num2);
	return 0;

• 位操作符: &  |  ^  ~

#include <stdio.h>
int main()
{
	int num1 = -3;
	//10000000000000000000000000000011   -- -3的原码
	//11111111111111111111111111111100   -- -3的反码
	//11111111111111111111111111111101   -- -3的补码
	int num2 = 5;
	//00000000000000000000000000000101   -- 5的原、反、补码
	printf("%d\n", num1 & num2);//按位与,有0为0,两个1才为1
	//11111111111111111111111111111101   -- -3的补码
	//00000000000000000000000000000101   --  5的补码
	//00000000000000000000000000000101   --  &按位与后的补码结果,首位为0,正数,原反补码相同,十进制为5
	printf("%d\n", num1 | num2);//按位或,有1为1,两个0才为0
	//11111111111111111111111111111101   -- -3的补码
	//00000000000000000000000000000101   --  5的补码
	//11111111111111111111111111111101   -- |按位或后的补码结果,首位为0,负数,补码取反+1得原码
	//10000000000000000000000000000011   -- |按位或后的原码结果,为-3
	printf("%d\n", num1 ^ num2);//按位异或,相同为00,不同为1
	//11111111111111111111111111111101   -- -3的补码
	//00000000000000000000000000000101   --  5的补码
	//11111111111111111111111111111000   --  ^按位异或后的补码结果,首位为1,负数,补码取反+1得原码
	//10000000000000000000000000001000   --  ^按位异或后的原码结果,为-8
	printf("%d\n", ~0);//按位取反,直接取反,0变1,1变0
	//00000000000000000000000000000000   --  0的原反补码
	//11111111111111111111111111111111   --  ~按位取反后的补码结果,首位为1,负数,补码取反+1得原码
	//10000000000000000000000000000001   --  ~按位取反后的原码结果,为-1
	return 0;
}

• 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、>= 、&= 、|= 、^=

• 单⽬操作符: !、++、--、&、*、+、-、~ 、sizeof、(类型)

• 关系操作符: > 、>= 、< 、<= 、 == 、 !=

• 逻辑操作符: && 、||

#include<stdio.h>
int main()
{
	int num;
	scanf("%d", &num);
	if (num % 4 == 0 && num % 100 != 0 || num % 400 == 0)//&&逻辑与,||逻辑或
		printf("num是闰年");
	else
		printf("num是平年");
	return 0;
}

• 条件操作符: ?  :

int a = 5;
int b = 10;
int max = (a > b) ? a : b; // 如果a大于b,则max等于a,否则等于b
//它的语法结构是 condition ? value_if_true : value_if_false。如果 condition 为真(非零),则返回 value_if_true;如果 condition 为假(零),则返回 value_if_false

• 逗号表达式: ,

// 代码1
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式,从左到右依次计算,整个表达式的结果是最后⼀个表达式的结果。
c是多少?//c==13

//代码2
if (a = b + 1, c = a / 2, d > 0)

//代码3
a = get_val();
count_val(a);
while (a > 0)
{
	//业务处理
	a = get_val();
	count_val(a);
}
如果使⽤逗号表达式,改写:
while (a = get_val(), count_val(a), a > 0)
{
	//业务处理
}

• 下标引⽤: [ ]

int arr[10];//创建数组
arr[9] = 10;//实⽤下标引⽤操作符。
//[ ]的两个操作数是arr和9。

• 函数调⽤: ( )

include <stdio.h>
void test1()
{
 printf("hehe\n");
}
void test2(const char *str)
{
 printf("%s\n", str);
}
int main()
{
 test1(); //这⾥的()就是作为函数调⽤操作符。
 test2("hello bit.");//这⾥的()就是函数调⽤操作符。
 return 0;
}

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值