linux设置char默认为无符号,[转载]char代表有符号还是无符号?

不带signed或unsigned关键字的char型 无符号数? 有符号数? C标准规定为 Implementation

Defined(由实作环境决定)。

arm-linux-gcc 规定 char 为 unsigned char 。

gcc规定为signed char

以前总以为 char 代表有符号,而 unsigned char 代表无符号。现在才知道如果换做 short 或 int

,这样理解都没问题,因为c标准明确定义了。但是,唯独 char 不能这样理解,因为c标准中对此是 Impementation

Defined,就是未明确定义,由具体的编译器明确定义。

为了代码移植,一定不要用 char !

我以前总以为 char 代表有符号,而 unsigned char 代表无符号。现在才知道如果换做 short 或 int

, 这样理解都没问题,因为c标准明确定义了。但是,唯独 char 不能这样理解,因为c标准中对此是 Impementation

Defined,就是未明确定义,由具体的编译器明确定义。

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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值