c语言符号深度理解和再认识( 四 )

<< num)//先从最高位检验{printf("1");}else{printf("0");}num--;}printf("\n");}int main(){unsigned int x = 0xFFFFFFFF;x <<= 1;ShowBit(x);return 0;}//输出结果:11111111111111111111111111111110,有符号数也是此结果,左移没有符号位差别
//右移#include void ShowBit(int x){int num = sizeof(x) * 8 - 1;//控制循环次数while (num >= 0){if (x & 1 << num)//先从最高位检验{printf("1");}else{printf("0");}num--;}printf("\n");}int main(){signed int x = 0xFFFFFFFE;//1111 1111 1111 1111 1111 1111 1111 1110(原本的x)x >>= 1;ShowBit(x);return 0;}//输出结果:11111111111111111111111111111111
丢弃问题
左移和右移都是在CPU中进行,参与移动的变量是在内存中的,所以需要把数据移动到CPU寄存器中,在进行移动 。在大小固定的单元内,一定会有位置到“外边”的情况 。(外边的理解就是超出了寄存器储存单元大小)

c语言符号深度理解和再认识

文章插图
2.深入理解
//左移#include int main(){unsigned int a = 1;printf("%u\n", a << 1);printf("%u\n", a << 2);printf("%u\n", a << 3);return 0;}//输出结果:2 4 8
//右移#include int main(){unsigned int b = 100;printf("%u\n", b >> 1);printf("%u\n", b >> 2);printf("%u\n", b >> 3);return 0;}//输出结果:50 25 12
//算术右移#include int main(){int c = -1;//1111 1111 1111 1111 1111 1111 1111 1111(补码)printf("%d\n", c >> 1);printf("%d\n", c >> 2);printf("%d\n", c >> 3);return 0;}//输出结果:-1 -1 -1
//算术右移#include int main(){unsigned int d = -1;printf("%d\n", d >> 1);printf("%d\n", d >> 2);printf("%d\n", d >> 3);return 0;}//不会报错,最高位补0
七、++和–操作符 (一)、初步了解
让代码run起来!
//前置++(先对a自增再使用)#include int main(){int a = 10;int b = ++a;printf("%d,%d\n", a, b);return 0;}//输出结果:11 11
#include //后置++(先使用再对a自增)int main(){int a = 10;int b = a++;printf("%d,%d\n", a, b);return 0;}//输出结果:11 10
(二)、深入理解后置++
还是用代码看现象
#include int main(){int a = 8;int b = a++;return 0;}
来看这段代码的反汇编:
这样就能很好的理解为什么是先使用再自增了 。
#include int main(0{int a = 8;a++;//并没有使用return 0;}
再来看这段代码的反汇编:
(三)、复杂表达式
#include int main(){int i =1;int j = (++i)+(++i)+(++i);printf("%d\n",j);return 0;}
这段代码在2022中输出结果是12,在gcc中输出结果是10 。不同的编译器有不同的计算规则 。
贪心算法(表达式匹配问题)
编译器依据符号自动匹配表达式 。
在2022中,我们每输完一条语句时,当我们打上分号,按下回车换行(enter)键时,编译器会自动匹配表达式 。
八、取模/取余运算问题 (一)、取整问题
通过代码看现象 。run起来!
1.向0取整
#include int main(){int i = -2.9;int j = 2.9;printf("%d\n", i);//输出结果是-2printf("%d\n", j);//输出结果是2return 0;}
看图:
c语言中默认是向0取整 。
c语言中有一个trunc取整函数:
通过代码了解: