[Linux学习]ARM中的char和X86的char的不同点

转自:http://blogger.org.cn/blog/more.asp?name=foxwolf&id=28687

对于char i=-1 打印出-1的结果

   说白也就是在x86体系结构中默认的是signed char.所以打印结果是:-1

   而在arm体系结构中默认的是unsigned char.所以打印的结果是:255

原因如下:

The following email fragment appeared on the linux-arm mailing list recently:


	> consider this simple program:
	> int main(void)
	> {
	>     char i = -1;
	>     printf("%d\n", i);
	>     return 0;
	> }
	>
	> The print out is 255 in stead of -1, unless I define i as
	> signed char i;
	> then I get the "-1" print out.
The above code is actually buggy in that it assumes that the type "char" is equivalent to "signed char". The C standards do say that "char" may either be a "signed char" or "unsigned char" and it is up to the compilers implementation or the platform which is followed.

As the poster points out, the above code does not work as expected if "char" is "unsigned". It is difficult to detect this code at compile time, since GCC does not issue any warnings. The only way to detect it is either by visual examination of the code, or by actually running it and finding a problem.

This causes problems on ARM based machines since "char" is of the "unsigned" variety, which allows the compiler to generate faster, more efficient code. ARM is not alone in this - SGI Mips running IRIX also encounters this problem.

However, dispite the lack of warning for the above case, GCC does warn with the following code:

        {
                char foo;

                foo = bar();

                if (foo == -1) {
                        ...
                }
        }
Code like the above will generate a compiler warning, which will be one of the following depending on the actual test used:
	warning: comparison is always 0 due to limited range of data type
	warning: comparison is always 1 due to limited range of data type
Please note however that the above warnings are not issued if "char" is "signed" and therefore can be difficult to pick up when compiling in such an environment.

The following table lists the four types of code which cause problems when "c" is declared as just "char", and the most likely correct method of fixing the code.

 CodeCorrectionReasoning
1.c = getopt()declare c as an "int"getopt() is defined as returning an "int" not a "char"
2.c = getc()declare c as an "int"getc() is defined as returning an "int" not a "char"
3.c == EOFdeclare c as an "int"EOF is a "negative integral constant"
4.c < 0
c >= 0
declare c as an "int" or "signed char"this is ambiguous and examination of the surrounding code should indicate which case is more correct. However, "int" is the perferred, unless the code is relying on some characteristic of "signed char".

Nos 1, 2 and 3 can cause problems even in a signed char environment. Take the instance of a file containing a byte value 0xff.


我们可以这样定义,用int8_t来代替char类型

#if !(__linux__)
typedef signed char               int8_t;
typedef short                     int16_t;
typedef int                       int32_t;
typedef long long                 int64_t;
#endif
typedef unsigned char             uint8_t;
typedef unsigned short            uint16_t;
typedef unsigned int              uint32_t;
typedef unsigned long long        uint64_t;

文章来源:http://www.arm.linux.org.uk/docs/faqs/signedchar.php


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值