C语言学习笔记1——有符号数和无符号数

有符号数和无符号数

C语言中:

· signed 关键字声明变量为有符号类型
· unsigned 关键字声明变量为无符号类型

注意: C语言中只有整数类型能够声明unsigne变量


有符号数和无符号数的分析1:表示法

有符号数(signed):

· 在计算机内部用补码表示有符号数

 —最高位为 0, 表示这个数为正数
 —最高位为 1, 表示这个数为负数

正数的补码为正数本身
负数的补码为负数的绝对值取反加 1

例:
8位整数 6 的补码为: 0000 0110
8位整数 -6 的补码为 : 1111 1010
16位整数 16 的补码为: 0000 0000 0001 0000
16位整数 -16 的补码为: 1111 1111 1111 0000

无符号数(unsigned):

· 在计算机内部用原码表示无符号数

-无符号数没有符号位, 只用于表示正数

有符号数和无符号数的分析2:取值范围

有符号数(signed):

· 因最高位为符号位

8位有符号数取值范围:-2^7————2^7 - 1
16位有符号数取值范围:-2^15————2^15 - 1
32位有符号数取值范围:-2^31————2^31 - 1

无符号数(unsigned):

· 无符号数只表示正数

8位无符号数取值范围:0————2^8 - 1
16位无符号数取值范围:0————2^16 - 1
32位无符号数取值范围:0————2^32 - 1


有符号数和无符号数的分析3:有符号数遇上无符号数

· 先上代码

#include 

int main()
{
    int i = -10;
    unsigned j = 5;

    if((i + j) > 0)
    {
        printf("i + j > 0\n");
    } 
    else
    {
        printf("i + j <= 0\n");
    }

    return 0;
}

运行结果为
i + j > 0

结论:

  1. 无符号数与有符号数混合运算时,编译器会将有符号数转化为无符号数后再进行运算,结果为无符号数
  2. 因此需小心使用unsigned关键字

你可能感兴趣的:(C)