C++之char , signed char , unsigned char
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。
C++之char , signed char , unsigned char相关推荐
- 报错笔记:cannot convert parameter 1 from 'char [1024]' to 'unsigned char *'
第一段:数组的类型是char,因此函数在引用const char 型的指针的时候,必须用char类型数组的首地址.如果是byte类型的指针的首地址,则会报cannot convert paramete ...
- c# char unsigned_关于C ++:将unsigned char *复制到unsigned char *
我需要将数据包状态保存一段时间. 因此,我读取了表示为unsigned char *的数据包数据,然后我用该数据创建了一条记录并将该记录保存在列表中一段时间. 这将是将记录中的数据包表示为char * ...
- (unsigned char *)a与*(unsigned char *)a的含义
一.(unsigned char *)&a运算顺序 1.先取a的地址 2.将&a强制类型转化为unsigned char *类型,为什么要加*号,因为要指向a的地址 二.*(unsig ...
- C语言高级编程:char、signed char 和 unsigned char的使用区别
1. 区别与联系: 1)在定义字符类型时一般使用char来定义 2)char被当成有符号或是无符号视不同编译器决定,由于ASCII码范围从0-0x7F(127),所以char无论被当成有符号还是无符号 ...
- oracle signed类型,char、signed char 和 unsigned char 的区别
ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char char相当于signed char或者unsigned char,但是这取决于编译器! 这三种字 ...
- char与signed char, unsigned char的区别
一.开始 今天有一个困扰的问题,就是char与signed char, unsigned char这三者的区别. 二.三者之间 1.ANSI C 提供了3种字符类型,分别是char.signed ch ...
- C语言中 unsigned char 与 signed char 不同输出格式一些认识
首先考虑下面代码输出什么? #include <stdio.h>int main(void){signed char a = -1;unsigned char b = -1;printf( ...
- C++之char , signed char , unsigned char(转)
ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char.而不是像short.int一样只有两种(int默认就是unsigned int). 三者都占1个字 ...
- 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 ...
最新文章
- Cnnot find System Java Compiler Ensure that you have installed a JDK
- pycharm Application cannot start in headless mode
- irobot扫地机器人 电压_【专利技术分析报告】“iRobot扫地机器人”核心专利
- Java基础day23
- C++ Qt 访问权限总结
- 阶段性总结_学习笔记
- 苹果A13打得过麒麟990吗?看完秒懂
- 首个在线教学中文预训练模型TAL-EduBERT
- python定位网页元素_python爬虫技术:如何定位网页上的内容?xpath定位元素
- CSS:输入框input光标距离输入框左边间距设置
- Oracle数据库通过创建触发器实现自增功能
- SQL JOIN--初级篇
- GAMES101-现代计算机图形学入门-闫令琪——Lecture 18 Advanced Topics in Rendering
- WebGIS第一课:测试高德API并通过
- 天降公网ip | 你也许已经有公网IP了
- conda 虚拟环境生成对应不同的jupyter快捷方式
- Windows下利用Chrome调试IOS设备页面
- flask----后续
- 币须知道 |马云又抢占了一块高地,蚂蚁金服区块链跨境汇款正式落地,2018世界杯板块排名涨幅第一...
- 2019年3月全国计算机报名入口广东,广东2019年3月全国计算机二级考试报名系统...