在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("----------------\n");

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

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

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

printf("%%d: %d, %d\n", 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++

转载于:https://www.cnblogs.com/gaoxianzhi/p/6683649.html

用unsigned char 表示字节相关推荐

  1. 打印不同对象的字节表示 ( 对int*强制转换成unsigned char*的理解 )

    此文章参考<深入理解计算机系统>P31. 先看如下代码:  12345的十六进制表示为:0x00003039 1 #include <stdio.h> 2 3 int main ...

  2. 2字节char转16进制unsigned char或者int

    在C语言中,常常需要将txt文件转换成bin文件,所以需要将两字节的字符,转换成16进制的unsigned char类型.有时也会将int型转换成两字节的char,还原时也需要转换. /*! @Bri ...

  3. linux 下byte,char,unsigned char的区别

    在linux中,对byte的定义为无符号char,而char默认为有符号char. #ifndef BYTE #define BYTE unsigned char #endif 以下ZZ百度知道: 在 ...

  4. char和unsigned char

    网络编程中一般都用unsigned char,而不用char,是因为把char强制转换成int或long时,系统会进行类型扩展. #include <stdio.h>int main() ...

  5. unsigned char对应java_Java的数据类型,怎么就没有uchar呢

    作者:陈珏秀 真头疼,因为java的数据类型没有uchar.今天把之前用C写的程序改成java的,但是由于java的数据类型中没有uchar,部分内容得不到相关转换. 我想 将图像src的像素值,然后 ...

  6. C/C++ unsigned char*类型

    C++ unsigned char *是表示无符号字符指针的意思. 细节如下: char 前面添加unsigned表示是无符号的字符,也就是不可以存储负数: 在数据类型后面加*表示指针的意思: 指针是 ...

  7. C语言高级编程:char、signed char 和 unsigned char的使用区别

    1. 区别与联系: 1)在定义字符类型时一般使用char来定义 2)char被当成有符号或是无符号视不同编译器决定,由于ASCII码范围从0-0x7F(127),所以char无论被当成有符号还是无符号 ...

  8. unsigned char s1 : 2的用法

    #include<stdio.h> #include<stdlib.h> //默认按照四字节对齐 //#pragma pack(1) union V {struct X{uns ...

  9. C++之char , signed char , unsigned char

    ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char.而不是像short.int一样只有两种(int默认就是unsigned int). 三者都占1个字 ...

最新文章

  1. 随机蕨(Random Fern)
  2. endnote国标_Citavi 与 Endnote 在 Word 插入引用,哪个更适合你?
  3. 对HashMap对象的键值对内容进行排序
  4. 架构设计:文件服务的设计与实现
  5. delphi adoquery 上一个下一个_从一个起点冲向下一个起点
  6. 社群数据分析:你运营的社群是好社群吗?
  7. Sort Integers by the Number of 1 Bits
  8. 有哪些比较基础的优质计算机书籍?
  9. Linux重定向console口控制台,Linux重定向console口控制台(Fedora)
  10. 文件上传解析器MultipartResolver
  11. A cycle was detected in the build path of project 'core'. The cycle consists of projects {core, sms}
  12. 数据库高并发的解决方案
  13. 帮助 help 命令
  14. [论文阅读笔记14]Nested named entity recognition revisited
  15. (个人笔记-无用勿喷)Windows软件包的安装与卸载
  16. SAP世界生存指南(2017版)
  17. HW:红队眼中的防守弱点与蓝队应对攻击的常用策略
  18. 串行同步通信“时钟同步”怎么理解?
  19. 速卖通物流发货用热敏打印机BTP-K900(U)1纸张高度与软件下发票面高度不符
  20. 宝宝智能起名,免费起名实现方案,带源码

热门文章

  1. 不生成新数组的迭代器方法:forEach()every()some()reduce()reduceRight()
  2. JavaScript基础——处理字符串
  3. 接口到底是什么(一语道破)
  4. 【转】奴性哲学十句话,洗脑常用词!!!
  5. Firefox 插件:鲜味 del.icio.us,和朋友分享你的收藏
  6. ASP.NET MVC 3.0学习系列文章—Model in ASP.NET MVC 3.0
  7. Elasticsearch--建议器
  8. 关于org.apache.lucene.queryParser.ParseException: Encountered 解决方法
  9. VSS (Visual Source Safe 2005) 用法详解
  10. 【配置文件】log4j是什么log4j