如何详细解释进制转换、原反补码、操作符功能、逗号表达式和表达式求值等操作?

2026-04-10 08:071阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1452个文字,预计阅读时间需要6分钟。

如何详细解释进制转换、原反补码、操作符功能、逗号表达式和表达式求值等操作?

1.进制

十进制(0~9)

二进制(0~1) 余0进1

十进制转二进制:十进制除以二进制的余数(从下往上排列)

八进制(0~7) 第一位是0

十六进制(0~F) 前两位是0X #2. 整数的二进制表示方法 构成:符号位+数值位(0表示正,1表示负)

3.原码反码补码

整形占用4个字节,即32个比特位 对于整数来说,内存中存放的是补码 正整数的原反补码都相同

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

补码:反码+1

4.移位操作符

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

<<左移操作符:左边抛弃,右边补0

>>右移操作符

1.逻辑右移:左边用0填充,右边丢弃2.左边用原该值的符号位填充,右边丢弃

5.位操作符

注:程序以补码的形式存储在内存中,十进制%2得到二进制的最低位;/2可去掉最低位,0为假,非零为真

&(按位与) 对应二进制位,有0则为0,两个同时为1才为1

a&1可以得到最低位是几

|(按位或),对应二进制位有1则为1,两个同时为0才为0^(按位异或)对应二进制位上,相同为0,相异为1;异或支持交换律~按位取反操作符:对应二进制位上,全部取反,包括符号位,0变1,1变0,得到补码

异或操作具有局限性:1.只能作用于整数交换 2.代码的可读性差 代码的执行效率低于使用第三个变量的方法

a^a=00^a=a

正整数的原码,反码和补码都相同负整数以补码的方式存在内存中

int main() { int num = -3; int num2 = 5; //num1:10000000000000000000000000000011[原码】(需要换成补码) //反码:11111111111111111111111111111100 //补码:11111111111111111111111111111101 //num2:00000000000000000000000000000101 int a = num & num2; //a=00000000000000000000000000000101=5 int b = num | num2; //b= 11111111111111111111111111111101 //反码:11111111111111111111111111111100 //原码:10000000000000000000000000000011=-3 int c = num ^ num2; //c= 11111111111111111111111111111000 //反码:11111111111111111111111111110111 //原码:10000000000000000000000000001000=-8 printf("%d\n%d\n%d\n", a, b, c); return 0; }

求一个整数存储在内存中的二进制中的1的个数

6.逗号表达式

逗号表达式的优先级是最低的,从左向右依次执行,整个表达式的结果是最后一个表达式的结果

int main() { int a = 0; int b = 2; int c = (a > b, a = b + 10, a, b = a + 1); //a>b为假,继续向后执行;a=b+10即a=12;a=12;b=13;即c=13 printf("%d\n", c); return 0; }

7.下标访问,函数调用

[]下标引用操作符

int arr[10] printf("%d",arr[9]);//打印下标是9的元素,操作数是arr和 9

()函数调用操作符:最少一个操作数

int ret=Add(2,3); //()的操作数是Add,2,3

sizeof不是函数,是操作符

8.优先级

先算优先级高的

由高到低排列:

如何详细解释进制转换、原反补码、操作符功能、逗号表达式和表达式求值等操作?

9.表达式求值

表达式求值之前要进行类型转换,当表达式的值转换到适当的类型才开始计算

整型提升

C语⾔中整型算术运算总是⾄少以缺省(int )整型类型的精度来进⾏的。

有符号整数:一位(符号位)+31位数值位无符号整数,没有符号位,32位都是数值位

如何进⾏整体提升呢?

  1. 有符号整数提升是按照变量的数据类型的符号位来提升的(vs中默认char类型是有符号位的)
  2. ⽆符号整数提升,⾼位补0

10.算术转换

本文共计1452个文字,预计阅读时间需要6分钟。

如何详细解释进制转换、原反补码、操作符功能、逗号表达式和表达式求值等操作?

1.进制

十进制(0~9)

二进制(0~1) 余0进1

十进制转二进制:十进制除以二进制的余数(从下往上排列)

八进制(0~7) 第一位是0

十六进制(0~F) 前两位是0X #2. 整数的二进制表示方法 构成:符号位+数值位(0表示正,1表示负)

3.原码反码补码

整形占用4个字节,即32个比特位 对于整数来说,内存中存放的是补码 正整数的原反补码都相同

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

补码:反码+1

4.移位操作符

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

<<左移操作符:左边抛弃,右边补0

>>右移操作符

1.逻辑右移:左边用0填充,右边丢弃2.左边用原该值的符号位填充,右边丢弃

5.位操作符

注:程序以补码的形式存储在内存中,十进制%2得到二进制的最低位;/2可去掉最低位,0为假,非零为真

&(按位与) 对应二进制位,有0则为0,两个同时为1才为1

a&1可以得到最低位是几

|(按位或),对应二进制位有1则为1,两个同时为0才为0^(按位异或)对应二进制位上,相同为0,相异为1;异或支持交换律~按位取反操作符:对应二进制位上,全部取反,包括符号位,0变1,1变0,得到补码

异或操作具有局限性:1.只能作用于整数交换 2.代码的可读性差 代码的执行效率低于使用第三个变量的方法

a^a=00^a=a

正整数的原码,反码和补码都相同负整数以补码的方式存在内存中

int main() { int num = -3; int num2 = 5; //num1:10000000000000000000000000000011[原码】(需要换成补码) //反码:11111111111111111111111111111100 //补码:11111111111111111111111111111101 //num2:00000000000000000000000000000101 int a = num & num2; //a=00000000000000000000000000000101=5 int b = num | num2; //b= 11111111111111111111111111111101 //反码:11111111111111111111111111111100 //原码:10000000000000000000000000000011=-3 int c = num ^ num2; //c= 11111111111111111111111111111000 //反码:11111111111111111111111111110111 //原码:10000000000000000000000000001000=-8 printf("%d\n%d\n%d\n", a, b, c); return 0; }

求一个整数存储在内存中的二进制中的1的个数

6.逗号表达式

逗号表达式的优先级是最低的,从左向右依次执行,整个表达式的结果是最后一个表达式的结果

int main() { int a = 0; int b = 2; int c = (a > b, a = b + 10, a, b = a + 1); //a>b为假,继续向后执行;a=b+10即a=12;a=12;b=13;即c=13 printf("%d\n", c); return 0; }

7.下标访问,函数调用

[]下标引用操作符

int arr[10] printf("%d",arr[9]);//打印下标是9的元素,操作数是arr和 9

()函数调用操作符:最少一个操作数

int ret=Add(2,3); //()的操作数是Add,2,3

sizeof不是函数,是操作符

8.优先级

先算优先级高的

由高到低排列:

如何详细解释进制转换、原反补码、操作符功能、逗号表达式和表达式求值等操作?

9.表达式求值

表达式求值之前要进行类型转换,当表达式的值转换到适当的类型才开始计算

整型提升

C语⾔中整型算术运算总是⾄少以缺省(int )整型类型的精度来进⾏的。

有符号整数:一位(符号位)+31位数值位无符号整数,没有符号位,32位都是数值位

如何进⾏整体提升呢?

  1. 有符号整数提升是按照变量的数据类型的符号位来提升的(vs中默认char类型是有符号位的)
  2. ⽆符号整数提升,⾼位补0

10.算术转换