#include <iostream>
#include <string>
using namespace std;
void test__1() {
// 溢出
short short_value = 32767;
short ival = 1;
// this calculation overflows
short_value += ival;
cout << "short_value: " << short_value << endl; // short_value: -32768
int ival1 = 21 / 6; // integral result obtained by truncating the remainder
int ival2 = 21 / 7;
cout << ival1 << endl; //3
cout << ival2 << endl; //3
}
void test__2() {
/*
当只有一个操作数为负数时,求模操作结果值的符号可依据分子(被除数)
或分母(除数)的符号而定。如果求模的结果随分子的符号,则除出来的值向零
一侧取整;如果求模与分母的符号匹配,则除出来的值向负无穷一侧取整。
*/
cout << -21 % -8 << endl; //-5
cout << 21 % -5 << endl; //1
cout << 21 / -5 << endl; //-4
cout << 21 % -5 << endl; //-4
}
/*
左移操作符(<<)在右边插入 0 以补充空位。对于右移操作符(>>),如
果其操作数是无符号数,则从左边开始插入 0;如果操作数是有符号数,则插入
符号位的副本或者 0 值,如何选择需依据具体的实现而定。移位操作的右操作
数不可以是负数,而且必须是严格小于左操作数位数的值。否则,操作的效果未
定义。
*/
void test_left_shift(){
unsigned int i = 2;
i = i << 2;
cout << i << endl; //8
int j = 2;
j = j << 1;
cout << j << endl; //4
}
void test_right_shift(){
int i = 4;
i = i >> 1;
cout << i << endl; //2
i = i >> 1;
cout << i << endl; //1
i = i >> 1;
cout << i << endl; //0
i = i >> 1;
cout << i << endl; //0
int j = 7 >> 1;
cout << j << endl; //3
}
void test_and_or_not(){
// 1、位异或:^
// 在每个位的位置,如果两个操作数对应的位只有一个(不是两个)为 1,则操作结果中该位为 1,否则为 0。
int i = 1;
int j = 2;
cout << (i ^ j) << endl;//3
// 2、位与:&
// 在每个位的位置,如果两个操作数对应的位都为 1,则操作结果中该位为 1,否则为 0。
cout << (i & j) << endl;//0
// 3、位或:|
// 在每个位的位置,如果两个操作数对应的位有一个或者两个都为 1,则操作结果中该位为 1,否则为 0。
cout << (i | j) << endl;//3
}