补码
- 本质上来看,补码的意义就是拿补码和原码可以加出一个溢出的0。
- 因此,00000001的补码就是11111111。在11111111被当作纯二进制看待时,是十进制的255,被当作补码看待时则是-1。
- 同理,对于-a来说,其补码就是0-a,实际是2^n-a,n是这种类型的位数
- 好处就是计算时,不需要调整加减,全部都是加法(+补码就相当于-原码)
unsigned
- unsigned使得整数型不以补码的形式表示负数,是其只有0和正整数部分。所以使用unsigned正整数表达部分范围扩大一倍,但是不能表达负数了。
- 如果一个字面量常数想要表达自己是unsigned,可以在后面加u/U:255U。
- 同理,想表达自己是个long,后面加L。
- unsigned的初衷不是为了扩展数能表达的范围,而是为了做纯二进制运算,主要是为了移位。
%d: int 和小于 int 范围的(char、short)都以 int 输出
%ld:long long
%u:unsigned
%lu:unsigned long long
想要输出8进制:用 %o 或 %O
想输出16进制:用 %x 或 %X
(小写的x输出小写的字母,大写的输出大写)
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
! | 逻辑非 | !a | a的true或false反转 |
&& | 逻辑与 | a&&b | 只有a&b都是true时结果才是true |
|| | 逻辑或 | a||b | 只有a&b都是false时结果才是false |
//格式:(类型名称) 值
(int)10.2;
(short)32;
/*但需注意安全性,小的变量不总能表达大的量。
如:
printf("%d\n",(short)32768);
因为short最大范围是32767,所以会被转化为-32768*/
优先级 | 运算符 | 结合性 |
---|---|---|
1 | () | 从左到右 |
2 | !,+,-,++,– | 从右到左(单目的+和-) |
3 | *,/,% | 从左到右 |
4 | +,- | 从左到右 |
5 | <,<=,>,>= | 从左到右 |
6 | ==,!= | 从左到右 |
7 | && | 从左到右 |
8 | || | 从左到右 |
9 | =,+=,-=,*=,/=,%= | 从右到左 |