跟着狄泰唐老师学C语言进阶教程的笔记之有符号与无符号
l 数据类型的最高位用于标识数据的符号
A. 最高位为1,表面这个数为负数
B. 最高位位0,表面这个数为正数
2. 有符号表示法l 在计算机内部用补码表示有符号数
A. 正数的补码为正数的本身
B. 负数的补码为负数的绝对值各位取反后加1
8位整数 5的补码位:0000 0101
8位整数 -7的补码位:1111 1001
16位整数 20的补码位:0000 0000 0001 0100
16位整数 -13的补码位:1111 1111 1111 0011
C. C语言中用二进制代码表示(前加0b):
//-7的二进制计算过程:
//00000111(7)===>11111000(取反)===>11111001(加1)
char c = 0b11111001;//-7
3. 无符号表示法l 在计算机内部用原码表示无符号数
l 对于固定长度的无符号数
A. MAX_VALUE+1 ——> MIN_VALUE
B. MIN_VALUE-1 ——> MAX_VALUE
4. signed和unsignedl C语言中变量默认为有符号的类型
l unsigned 关键字声明为无符号类型
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC850.tmp.png
l C语言中只有整数类型能够声明unsigned变量
l 当有符号和无符号进行运算时,有符号类型会自动转变为有符号类型来进行运算
int test2()
{
unsigned int i = 5;
int j = -10;
if ((i + j) > 0)
{
printf("i+j>0\n");
}
else
{
printf("i+j<=0\n");
}
return 0;
}
l unsigned类型错误使用案列
int test3()
{
unsigned int i = 0;
//i是无符号数,最小值为0,当进行减1时,会变为无符号的最大值,所以程序会进入死循环
for (i = 9; i >= 0; i--)
{
printf("i=%u\n", i);
}
return 0;
}
5. 小结l 有符号用补码表示
A. 正数的符号位为0
B. 负数的符号位为1
l 无符号用原码表示
A. 无符号数没有符号位
B. 无符号数只用于表示正数
l unsigned 只能修饰整数类型的变量
l 当无符号与有符号数进行计算时,会将有符号数转换为无符号数后再进行计算,结果为无符号数