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

三者都占1个字节(1 byte),因此:

signed char取值范围是 -128 到 127(有符号位)
unsigned char 取值范围是 0 到 255

这个大家都很清楚!!

但是char 呢?范围是多少?

答案是:不一定!!!

我们先看一下大师们怎么说的:

(Thinking in C++ 2nd):

signed is the default and is only necessary with char; char may or may not default to signed. By specifying signed char, you force the sign bit to be used.

译文:有符号类型是默认(指的是对于其他整型如int等来说)的类型并且仅对于char来说才是必须的。char有可能是signed也有可能是unsigned(我想这可能取决于编译器的具体实现)。但通过显式地指定一个char为signed,你就迫使其成为有符号的字符型。

我的看法是:

我们首先从这些类型的用处开始想起!

char是用来声明字符的!

而signed char和unsigned char是用来声明数值的,和int与unsigned int一样,只是其占据的空间少(这在手机等空间有限的嵌入式系统中尤其有效!),表示的范围有限。

那么char在各个编译器中是怎样实现的?

c标准中对此是 Impementation Defined,就是未明确定义,由具体的编译器明确定义。

但是一般都是用signed char或unsigned char来实现char的,因为这三种类型的对象在存储介质中的表现形式是一样的(都是一个占8bit的01串,只是解析的时候不同)。

至于到底是signed char还是unsigned char,各个编译器不同!!VC编译器、x86上的GCC都把char定义为signed char,而arm-linux-gcc却把char定义为 unsigned char.

这样一来,在代码移植(困扰我们程序员的一个问题)上就会出现问题,举个最简单的例子:

char a = 0xb6;

if ( a == 0xb6) puts("hello world !");

在vc 或 x86的gcc 上,都是不会打印出 hello world! 的。

用 arm-linux-gcc 编译,在arm板上,是可以打印出hello world ! 的。

我们再变化一下:

char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;

if ( a == 0xb6) puts("a");
if ( b == 0xb600) puts("b");
if ( c == 0xb6000000) puts("c");

在vc 或 x86的gcc 上,只会打印出 c 。用 arm-linux-gcc 编译,在arm板上,是可以打印出 a 和 c 。是不是发现了什么了呢?

首先,介绍 Integer Promotion(整数提升) 。通俗点说,c在处理整型(char short int)时,都会自动提升为int(如果int范围不够,则提升成 unsigned int)。比如  “a == 0xb6”,首先0xb6会当一个int来处理,变为0x000000b6(关于常量,后面还会仔细说明)。a 会提升为int ,假如 char 被定义为有符合的,那么 a 为负数,因为最高位为1,所以 a会提升为 0xffffffb6。假如 char 被定义为无符号的,那么a会提升为 0x000000b6 。

即,在vc 或 x86的gcc 上,(a == 0xb6) 会变为 (0xffffffb6 == 0x000000b6) ,而在 arm-linux-gcc 上,变为(0x000000b6 == 0x000000b6)。

对于 short,因为c标准明确规定 不加关键字,就代表有符号数。所以,无论在什么编译器上 b == 0xb600 都会变成 0xffffb600 == 0x0000b600 。

对于 int,本身是int,也就不用 Integer Promotion 了,所以  c == 0xb60000 中 ,c不做任何处理,直接从内存中读出来,即  0xb60000 == 0xb60000。

最后,简单说一下常量。用八进制(0开头)或十六进制(0x开头)表示的常量,他们都会当成无符号数处理! 另外 像 char a = 0xb6; 这句就有两个 Implementation Defined,一个是char带不带符号,另外一个是,假如char为有符号, 0xb6 会当int 0x000000b6 处理,把这个int 变为 有符号的 char 有溢出,会有问题,0xb6本为正数,赋值到a中却变为负数,具体要怎么处理,c对此也是 Implementation Defined。

Fr:http://hi.baidu.com/nicker2010/blog/item/11eb1a496147743a08f7efad.html

C++之char , signed char , unsigned char相关推荐

  1. 报错笔记:cannot convert parameter 1 from 'char [1024]' to 'unsigned char *'

    第一段:数组的类型是char,因此函数在引用const char 型的指针的时候,必须用char类型数组的首地址.如果是byte类型的指针的首地址,则会报cannot convert paramete ...

  2. c# char unsigned_关于C ++:将unsigned char *复制到unsigned char *

    我需要将数据包状态保存一段时间. 因此,我读取了表示为unsigned char *的数据包数据,然后我用该数据创建了一条记录并将该记录保存在列表中一段时间. 这将是将记录中的数据包表示为char * ...

  3. (unsigned char *)a与*(unsigned char *)a的含义

    一.(unsigned char *)&a运算顺序 1.先取a的地址 2.将&a强制类型转化为unsigned char *类型,为什么要加*号,因为要指向a的地址 二.*(unsig ...

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

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

  5. oracle signed类型,char、signed char 和 unsigned char 的区别

    ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char char相当于signed char或者unsigned char,但是这取决于编译器! 这三种字 ...

  6. char与signed char, unsigned char的区别

    一.开始 今天有一个困扰的问题,就是char与signed char, unsigned char这三者的区别. 二.三者之间 1.ANSI C 提供了3种字符类型,分别是char.signed ch ...

  7. C语言中 unsigned char 与 signed char 不同输出格式一些认识

    首先考虑下面代码输出什么? #include <stdio.h>int main(void){signed char a = -1;unsigned char b = -1;printf( ...

  8. C++之char , signed char , unsigned char(转)

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

  9. 2018-7-16 2-1 分别由signed 和unsigned 限定的 char,short,int,long类型变量的取值范围

    #include<stdio.h> #include<limits.h> #define debug1 0 //使用debug1 必须包含limits.h #define de ...

最新文章

  1. Cnnot find System Java Compiler Ensure that you have installed a JDK
  2. pycharm Application cannot start in headless mode
  3. irobot扫地机器人 电压_【专利技术分析报告】“iRobot扫地机器人”核心专利
  4. Java基础day23
  5. C++ Qt 访问权限总结
  6. 阶段性总结_学习笔记
  7. 苹果A13打得过麒麟990吗?看完秒懂
  8. 首个在线教学中文预训练模型TAL-EduBERT
  9. python定位网页元素_python爬虫技术:如何定位网页上的内容?xpath定位元素
  10. CSS:输入框input光标距离输入框左边间距设置
  11. Oracle数据库通过创建触发器实现自增功能
  12. SQL JOIN--初级篇
  13. GAMES101-现代计算机图形学入门-闫令琪——Lecture 18 Advanced Topics in Rendering
  14. WebGIS第一课:测试高德API并通过
  15. 天降公网ip | 你也许已经有公网IP了
  16. conda 虚拟环境生成对应不同的jupyter快捷方式
  17. Windows下利用Chrome调试IOS设备页面
  18. flask----后续
  19. 币须知道 |马云又抢占了一块高地,蚂蚁金服区块链跨境汇款正式落地,2018世界杯板块排名涨幅第一...
  20. 2019年3月全国计算机报名入口广东,广东2019年3月全国计算机二级考试报名系统...

热门文章

  1. 如何把winform图片背景换成透明颜色_如何用photoshop更换图片背景颜色?
  2. 2022年软考信息安全工程师考试备考指南
  3. rviz中的相关配置
  4. Codeforces 482 - Diverse Permutation 构造题
  5. #C++初学记录(阶乘#递归)
  6. K-means算法应用:图片压缩
  7. UML和模式应用5:细化阶段(5)---系统顺序图
  8. mybatis系列-06-输入映射
  9. IDEA中配置Python环境并运行
  10. Flutter 底部向上动画弹出的菜单选项