zoukankan      html  css  js  c++  java
  • 用unsigned char 表示字节

    在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别 

    首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。

    在实际使用过程种有什么区别呢?

    主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高位而已,在屏幕上面的显示可能不一样。

    但是我们却发现在表示byte时,都用unsigned char,这是为什么呢?

    首先我们通常意义上理解,byte没有什么符号位之说,更重要的是如果将byte的值赋给int,long等数据类型时,系统会做一些额外的工作。

    如果是char,那么系统认为最高位是符号位,而int可能是16或者32位,那么会对最高位进行扩展(注意,赋给unsigned int也会扩展)

    而如果是unsigned char,那么不会扩展。

    这就是二者的最大区别。

    同理可以推导到其它的类型,比如short, unsigned short。等等

    具体可以通过下面的小例子看看其区别

    include <stdio.h>

    void f(unsigned char v)

    {

        char c = v;

        unsigned char uc = v;

        unsigned int a = c, b = uc;

        int i = c, j = uc;

        printf("---------------- ");

        printf("%%c: %c, %c ", c, uc);

        printf("%%X: %X, %X ", c, uc);

        printf("%%u: %u, %u ", a, b);

        printf("%%d: %d, %d ", i, j);

    }

    int main(int argc, char *argv[])

    {

        f(0x80);

        f(0x7F); 

        return 0;

    }

    输出结果:

    ----------------

    %c: ?, ?

    %X: FFFFFF80, 80

    %u: 4294967168, 128

    %d: -128, 128

    ----------------

    %c: , 

    %X: 7F, 7F

    %u: 127, 127

    %d: 127, 127

    由此可见,最高位若为0时,二者没有区别,若为0时,则有区别了。

     
     
    分类: C&C++
  • 相关阅读:
    记第一场省选
    POJ 2083 Fractal 分形
    CodeForces 605A Sorting Railway Cars 思维
    FZU 1896 神奇的魔法数 dp
    FZU 1893 内存管理 模拟
    FZU 1894 志愿者选拔 单调队列
    FZU 1920 Left Mouse Button 简单搜索
    FZU 2086 餐厅点餐
    poj 2299 Ultra-QuickSort 逆序对模版题
    COMP9313 week4a MapReduce
  • 原文地址:https://www.cnblogs.com/gaoxianzhi/p/6683649.html
Copyright © 2011-2022 走看看