ARM中的char和X86的char的不同点
2016-01-06 10:09
447 查看
转自:http://blogger.org.cn/blog/more.asp?name=foxwolf&id=28687
参考资料:
http://blog.cdleary.com/2012/11/arm-chars-are-unsigned-by-default/
对于char i=-1 打印出-1的结果
说白也就是在x86体系结构中默认的是signed char.所以打印结果是:-1
而在arm体系结构中默认的是unsigned char.所以打印的结果是:255
原因如下:
The following email fragment appeared on the linux-arm mailing list recently:
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:
Code like the above will generate a compiler warning, which will be one of the following depending on the actual test used:
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.
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
参考资料:
ARM chars are unsigned by default
http://blog.cdleary.com/2012/11/arm-chars-are-unsigned-by-default/对于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 < 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". |
文章来源:http://www.arm.linux.org.uk/docs/faqs/signedchar.php
相关文章推荐
- svn
- 帮 C/C++ 程序员彻底了解链接器
- C++Lamda表达式
- WebApp新手创作--注册页面
- OOM(1)
- javascript类型系统之基本数据类型与包装类型
- iphone手机不同版本兼容、横竖屏
- Javascript Ajax 传值 乱码 问题!
- 160106_html5
- WdatePicker 日期控件- 功能及示范
- ElasticSearch部署-Ubuntu
- CSS3——文本、段落
- Threads in Java
- 一次bug死磕经历之Hbase堆内存小导致regionserver频繁挂掉
- android初学之android:screenOrientation属性
- Eclipse安装svn插件
- C#递归算法详解
- Failed to resolve: com.android.support:support-v4:23.1.1
- vs2013 按钮贴图
- 如何同步播放asf和vga文件的教学视频