本站首页    管理页面    写新日志    退出                                          --==~欢迎光临FoxWolf的Blog~==--   



 日志搜索


«November 2025»
1
2345678
9101112131415
16171819202122
23242526272829
30


公告


我的分类

日志更新

最新评论

留言板

链接

 


Blog信息
blog名称:FoxWolf
日志总数:127
评论数量:246
留言数量:0
访问次数:859719
建立时间:2006年5月31日




[Linux学习]ARM中的char和X86的char的不同点
原创空间,  软件技术

FoxWolf 发表于 2007/10/13 16:12:30

 对于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.   Code Correction Reasoning 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 == EOF declare c as an "int" EOF is a "negative integral constant" 4. c < 0c >= 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. 文章来源:http://www.arm.linux.org.uk/docs/faqs/signedchar.php


阅读全文(2782) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.672 second(s), page refreshed 144796533 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号