zoukankan      html  css  js  c++  java
  • C 中 char、signed char 和 unsigned char 的区别

    C 中 char、signed char 和 unsigned char 的区别

    来源:http://bbs.chinaunix.net/thread-889260-1-1.html

    参考:https://publications.gbdirect.co.uk//c_book/chapter2/integral_types.html

    ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char
    char相当于signed char或者unsigned char,但是这取决于编译器
    这三种字符类型都是按照1个字节存储的,可以保存256个不同的值。
    signed char取值范围是 -128 到 127
    unsigned char 取值范围是 0 到 255

    但是char究竟相当于signed char呢还是相当于unsigned char呢??
    这就是char和int的不同之处!
    int == signed int,但是char不能简单以为 == signed char


    要确定char究竟等同什么要基于不同的编译器做测试
    大多数机器使用补码来存储整数,在这些机器中按照整数类型存储的-1的所有位均是1
    假设我的机器也是如此存储,就能据此判断char究竟是等于signed char还是unsigned char

    编译器提供以下参数来对char类型进行设置,
    -funsigned-char : 设置为 unsigned char
    -fno-signed-char : 设置为 非 signed char
    -fsigned-char : 设置为 signed char
    -fno-unsigned-char : 设置为 非 unsigned char

    limits.h

    /* Number of bits in a `char'.    */
    #  define CHAR_BIT    8
    
    /* Minimum and maximum values a `signed char' can hold.  */
    #  define SCHAR_MIN    (-128)
    #  define SCHAR_MAX    127
    
    /* Maximum value an `unsigned char' can hold.  (Minimum is 0.)  */
    #  define UCHAR_MAX    255
    
    /* Minimum and maximum values a `char' can hold.  */
    #  ifdef __CHAR_UNSIGNED__
    #   define CHAR_MIN    0
    #   define CHAR_MAX    UCHAR_MAX
    #  else
    #   define CHAR_MIN    SCHAR_MIN
    #   define CHAR_MAX    SCHAR_MAX
    #  endif
    /* The character type that char matches (i.e., signed or unsigned)
     */
    #if CHAR_MIN < 0
    typedef signed char underlying_char_type;
    #else
    typedef unsigned char underlying_char_type;
    #endif

    test_char.c

    #include <stdio.h>
    
    int main(void) 
    {
        char a = -1;
        signed char b = -1;
        unsigned char c = -1;
    
        printf("a=%d, b=%d, c=%d
    ", a, b, c);
        return 0;
    }

    output

    # ./test_char.elf 
    a=-1, b=-1, c=255 // 从这里可以看出 默认的 char 类型就是 signed char 类型

    ============ End

  • 相关阅读:
    Ubuntu mongodb 安装和配置
    最基本的SQL语法/语句
    Sphinx学习之sphinx的安装篇
    六关节机器人的雅可比矩阵及微分运算
    六关节机器人的逆运动学计算
    六关节机器人的正运动学计算
    六关节机器人末端的微分运动
    Python3 升级pip
    一般多项式曲线的最小二乘回归(Linear Regression)
    关于卡尔曼滤波(Kalman Filter)的很好讲解
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/10913024.html
Copyright © 2011-2022 走看看