2_有符号和无符号

作者: 编程半岛 | 来源:发表于2018-03-01 13:42 被阅读11次

关键词:计算机中的符号位、有符号数的表示法、无符号数的表示法、signedunsigned、无符号数和有符号数的混合运算、错误使用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. signedunsigned

  • 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语言深度解析》所做的笔记,文章中包含狄泰软件资料内容一切版权归狄泰软件所有!

相关文章

  • 2_有符号和无符号

    关键词:计算机中的符号位、有符号数的表示法、无符号数的表示法、signed和unsigned、无符号数和有符号数的...

  • 整形数据 C

    有符号 int long 进制 无符号 有符号和无符号的区别 http://www.cnblogs.com/laz...

  • 有符号数和无符号数

    在计算机中,若一个数代表有符号数,则一个n位数的最高位代表正数或负数,其余位取反加1。比如1000_0000,则除...

  • 有符号数和无符号数

    1.无符号数是相对于有符号数而言的,指的是整个机器字长的全部二进制位均表示数值位,相当于数的绝对值,表示非负数。 ...

  • 有符号数和无符号数

    在计算机中,若一个数代表有符号数,则一个n位数的最高位代表正数或负数,其余位取反加1,比如1000_0000,则除...

  • 无符号和有符号的区别

    2016.10.24 无符号和有符号, 在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需要声...

  • 3.MySQL数据类型

    整型 每种类型都分为有符号和无符号,默认都是有符号,无符号的在后面加上UNSIGNED。 浮点型 FLOAT[(M...

  • Guava-原生类型

    无符号和有符号 在计算机中,可以区分正负的类型,称为有符号类型,无正负的类型,称为无符号类型。 概述 Java的原...

  • 有符号,无符号(转载)

    名称字节长度取值范围bool1false,truechar1-128~127signed char1-128~12...

  • js实现无符号整数按位`取反`

    什么是无符号整数和有符号整数? 有符号就是最高位是符号位,其余的位是数据位。无符号就是所有位都是数据位。比如cha...

网友评论

    本文标题:2_有符号和无符号

    本文链接:https://www.haomeiwen.com/subject/aofgxftx.html