微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 跟着狄泰唐老师学C语言进阶教程的笔记之有符号与无符号

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

时间:10-02 整理:3721RD 点击:
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. signed和unsigned

l 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 当无符号与有符号数进行计算时,会将有符号数转换为无符号数后再进行计算,结果为无符号数


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top