关键词:计算机中的符号位、有符号数的表示法、无符号数的表示法、signed
和unsigned
、无符号数和有符号数的混合运算、错误使用unsigned
的后果
1. 计算机中的符号位
数据类型的最高位用于识别数据的符号
- 最高位为1,表明这个数为负数
- 最高位为0,表明这个数为正数
#include <stdio.h>
int main()
{
char c = -5;
short s = 6;
int i = -7;
printf("%d\n", (( c & 0x80 ) == 0)); // &:表示按位与运算; 0x80对应的二进制为:1000 0000
printf("%d\n", (( s & 0x8000 ) == 0));
printf("%d\n", (( i & 0x800000 ) == 0));
}
输出结果:
0
1
0
总结:通过以上示例代码可证:正数最高位为0,负数的最高位为1,即最高位为符号位
2. 有符号数的表示法
在计算机内部用补码表示有符号数:
- 正数的补码为正数本身
- 负数的补码为负数的绝对值各位取反后加1
8位整数5的补码为:0000 0101
8位整数-7的补码为:1111 1001
16位正数20的补码为:0000 0000 0001 0100
16位正数-13的补码为:1111 1111 1111 0011
3. 无符号数的表示法
在计算机内部用原码表示无符号数
- 无符号数默认为正数
- 无符号数没有符号位
- 无符号数最小值为0
- 无符号数最大值由数据所占内存大小决定
对于固定长度的无符号数
-
MAX_VALUE
+ 1 ->MIN_VALUE
-
MIN_VALUE
– 1 ->MAX_VALUE
#include <stdio.h>
int main()
{
unsigned char c = 255;
unsigned char c2 = 0;
printf("%d\n", (unsigned char)(c + 1));
printf("%d\n", (unsigned char)(c2 - 1));
return 0;
}
输出结果:
0
255
4. signed
和unsigned
- C语言中变量默认为有符号的类型
-
unsigned
关键字声明变量为无符号类型 - 注意:C语言中只有整数类型(char, short, int,long,等等)能够声明
unsigned
变量,浮点类型(float, double)不能够声明unsigned
变量。
5. 当无符号数遇见有符号数
#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
总结:当有符号数和无符号数混合运算时,有符号数就会主动的转换为无符号类型。当有符号数为负数时,转换为无符号数后会是一个很大的正数。
6. 错误使用unsigned
#include <stdio.h>
int main()
{
unsigned int i = 0;
for(i=9; i>=0; i--)
{
printf("%u\n", i);
}
return 0;
}
输出结果:程序进入死循环
总结:i为无符号类型,i的最小值为0。当i=0时,i–后i的值为unsigned int
类型的最大值,因此,i恒大于等于0,程序进入死循环。
7. 小结
- 有符号数用补码表示
正数的符号位为0
负数的符号位为1 - 无符号数用原码表示
无符号数没有符号位
无符号数只用于表示正数 -
unsigned
只能修饰整数类型的变量 - 当无符号数与有符号数混合计算时,会将有符号数转换为无符号数后再进行计算,结果为无符号数。
声明:此文章为本人在学习狄泰软件学院《C语言深度解析》所做的笔记,文章中包含狄泰软件资料内容一切版权归狄泰软件所有!