免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: 小羊咪咪
打印 上一主题 下一主题

0xff 是多少? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-12-09 19:13 |只看该作者

回复 #14 zx_wing 的帖子

那我给你科普一下
15 The three types char, signed char, and unsigned char are collectively called
the character types. The implementation shall define char to have the same range,
representation, and behavior as either signed char or unsigned char.35)

ISO/IEC 9899:1999 (E)标准的第49页


gcc有一个选项可以用来控制char究竟是采用signed还是unsigned的实现

  1. #include <stdio.h>
  2. int main(void){
  3.     int a = (char) 0xff;
  4.     printf("%08x\n",a);
  5.     return 0;
  6. }
复制代码
kernel@fairland:~/programming/C$ cc -fsigned-char char.c -o char
kernel@fairland:~/programming/C$ ./char
ffffffff
kernel@fairland:~/programming/C$ cc -funsigned-char char.c -o char
kernel@fairland:~/programming/C$ ./char
000000ff
kernel@fairland:~/programming/C$ cc char.c -o char
kernel@fairland:~/programming/C$ ./char
ffffffff

默认是signed,这是为了保证ABI的一致性,就跟为什么double在gcc上默认是4个字节对齐一个道理(除非加-malign-double)

[ 本帖最后由 churchmice 于 2009-12-9 19:23 编辑 ]

论坛徽章:
0
22 [报告]
发表于 2009-12-09 20:33 |只看该作者
原帖由 churchmice 于 2009-12-9 19:13 发表
那我给你科普一下

ISO/IEC 9899:1999 (E)标准的第49页


gcc有一个选项可以用来控制char究竟是采用signed还是unsigned的实现

#include
int main(void){
    int a = (char) 0xff;
    printf("%08 ...


谢谢。关于第一个问题还有个疑问,标准是否对其它类型有类似规定?如果没有,单独对于char的规定不知道有何用意。

>>默认是signed,这是为了保证ABI的一致性,就跟为什么double在gcc上默认是4个字节对齐一个道理
从前面kmindg兄弟转的帖子看的出来,这个确实是实现相关,没有默认是什么的说法。至于ABI,我查阅了IA架构(除IA64)的ABI手册
《SYSTEM V
APPLICATION
BINARY INTERFACE
Intel386(TM) Architecture
Processor Supplement
Fourth Edition》 以及
《SystemVApplicationBinaryInterface
AMD64ArchitectureProcessorSupplement
DraftVersion0.99》
没有找到关于IA平台上,scalar类型默认是有符号的说法。当然我可能找的不细致,兄弟有资料佐证麻烦贴一下。

论坛徽章:
0
23 [报告]
发表于 2009-12-09 20:34 |只看该作者
原帖由 kmindg 于 2009-12-9 18:22 发表



转帖:http://www.cnitblog.com/cqshen/archive/2007/09/25/34016.html
zx看一下

谢啦,长见识了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
24 [报告]
发表于 2009-12-09 20:48 |只看该作者
原帖由 zx_wing 于 2009-12-9 20:34 发表

谢啦,长见识了


不客气
我也是现学现卖

论坛徽章:
0
25 [报告]
发表于 2009-12-09 22:59 |只看该作者

回复 #22 zx_wing 的帖子

1.第一个问题,类似的还有bit field-relatd option,类似的也有
-fsigned-bitfields -funsigned-bitfields 的开关
这个可以man gcc看一下
2.我说的是gcc的ABI,ms编译器的实现跟gcc当然是不一样的,IA32平台上面跑着许多不同的编译器。ms那玩意我不熟悉,记得double是按8字节对齐的。我当初就是在gcc上试出来不一样,后来去搜了下才发现是为了保证abi的一致性。
gcc里面一些默认的行为可以查看
http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc.pdf
从251页开始讲述了implementation defined的情况在gcc中是如何实现的,以及相应的c标准
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP