文章目录
1 有符号数
1.1 有符号数的表示
有符号数在计算机内部用补码表示:
- 正数的补码为正数本身。
- 负数的补码为负数的绝对值各位取反后加1。
比如:
- 8位整数5的补码为:0000 0101
- 8位整数-7的补码为:1111 1001
- 16位整数20的补码为:0000 0000 0001 0100
- 16位整数-13的补码为:1111 1111 1111 0011
1.2 计算负数的补码的两种方法
以8位整数-7为例:
负数的绝对值各位取反后加1:
- -7的绝对值为7,二进制为:0000 0111
- 各位取反:1111 1000
- 加1:1111 1001
负数的绝对值从最低位开始第一个不为0的位之后各位取反:
4. -7的绝对值为7,二进制为:0000 0111
5. 取反:1111 1001
1.3 经典的有符号数问题
下面会输出啥?
void test35()
{
int a;
char c = 0xaa;
if (c == 0xaa)
{
cout << "c == 0xaa" << endl;
}
else
{
cout << "c != 0xaa" << endl;
}
}
我以为输出"c == 0xaa",可是编译器却输出了"c != 0xaa"!事出反常必是我菜鸡,看看反汇编吧:

2 无符号数
2.1 无符号数的表示方法
在计算机内部用原码表示无符号数:
- 无符号数默认为正数。
- 无符号数没有符号位。
对于固定长度的无符号数:
- MAX_VALUE + 1 ⇒ MIN_VALUE
- MIN_VALUE - 1⇒ MAX_VALUE
2.2 C语言中的signed和unsigned
C语言中的变量默认为有符号类型,我们可以使用unsigned关键字声明变量为无符号类型。

C语言中只有整数类型能够声明unsigned变量。
2.3 当无符号数遇见有符号数
当无符号数与有符号数混合计算时,会将有符号数转换为无符号数后再进行计算,结果为无符号数。
#include <stdio.h>
int main()
{
unsigned int i = 5;
int j = -10;
if( (i + j) > 0 )
{
printf("i + j > 0\n");
}
else
{
printf("i + j <= 0\n");
}
return 0;
}
// 输出结果为:i + j > 0
2.4 错误的使用了unsigned
#include <stdio.h>
int main()
{
unsigned int i = 0;
for(i=9; i>=0; i--)
{
printf("i = %u\n", i);
}
return 0;
}
如上程序将是死循环!unsigned类型的变量永远不可能小于0。
参考资料:
5747

被折叠的 条评论
为什么被折叠?



