单片机/MCUwilliam hill官网
直播中

7年用户 48经验值
擅长:266327
私信 关注
[文章]

跟着狄泰唐老师学C语言进阶教程的笔记之有符号与无符号

1. 计算机中的符号位
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. signedunsigned
l C语言中变量默认为有符号的类型
l unsigned 关键字声明为无符号类型
l C语言中只有整数类型能够声明unsigned变量
l 当有符号和无符号进行运算时,有符号类型会自动转变为有符号类型来进行运算
int test2()
{
        unsigned int i = 5;
        int j = -10;
        if ((i + j) > 0)
        {
                printf("i+j>0n");
        }
        else
        {
                printf("i+j<=0n");
        }
        return 0;
}
l unsigned类型错误使用案列
int test3()
{
        unsigned int i = 0;
        //i是无符号数,最小值为0,当进行减1时,会变为无符号的最大值,所以程序会进入死循环
        for (i = 9; i >= 0; i--)
        {
                printf("i=%un", i);
        }
        return 0;
}
5. 小结
l 有符号用补码表示
A. 正数的符号位为0
B. 负数的符号位为1
l 无符号用原码表示
A. 无符号数没有符号位
B. 无符号数只用于表示正数
l unsigned 只能修饰整数类型的变量
l 当无符号与有符号数进行计算时,会将有符号数转换为无符号数后再进行计算,结果为无符号数

更多回帖

发帖
×
20
完善资料,
赚取积分