1字节不是一定是8位。

结论写在前面

sizeof返回的是以字节(byte)为单位的大小,char的大小永远都是1字节。

字节通常情况下为8位,但是不是必然,也可能是别的大小,比如TI的28x系列DSP里 一个字节的大小为16位。

事情经给

前段时间,发现一个没见过的事情,TI的28x系列DSP中,一个char占据的空间是16位的,但是sizeof(char)的返回值是1。

一开始没注意,后来在程序里读文件,发现读到的值和预期的效果有差异,调试看内存发现从文件读进的一个连续的char的数组,竟然是16位16位占空间的。给char的变量赋值0xFFFF也可以正常的赋值,内存里显示的变量内容就是0xFFFF。于是我认为这个char大小就是16位。

就把这个现象微信群里和朋友说了下,朋友死活不信,认为char就是八位。只不过编译器为了运算效率,内存存储优化成了16字节。哪怕内存监视的时候显示是16位,但用的时候只能按照8位用。

双方僵持不下,当时DSP这块板子也不在身边,没办法talk is less, show me the code。

于是开始翻C89的规范。

里面很明确的提到了sizeof返回的是以byte为单位的大小,而且sizeof(char)的返回值必然为1,也就是1byte。

当时我的认知一直认为一个byte就是8位,所以感觉,这里的c标准在自相矛盾,怀疑是这句子里存在着我不懂的语法,导致我的理解问题有问题(后来证明我想太多)。

后来接着搜各种关键词,搜到了一份28x系列的编译器用户指南,

Note这一段讲的非常清楚。这个系列的Byte大小是16位的。又去搜了下Byte这个词条,发现Wiki上也没有说Byte一定是八位的。

所以问题解决,结论见上。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
西安郵電學院 计算机网络技术及应用实验 报 告 书 "系部名称 ": "管理工程学院 " "学生姓名 ": "*** " "专业名称 ": "********* " "班 级 ": "**** " "学号 ": "******** " "时间 ": "2012年04月01日 " 实验题目 Wireshark抓包分析实验 1. 实验目的 1.了解并会初步使用Wireshark,能在所用电脑上进行抓包 2.了解IP数据包格式,能应用该软件分析数据包格式 3.查看一个抓到的包的内容,并分析对应的IP数据包格式 二.实验内容 1.安装Wireshark,简单描述安装步骤。 安装过程:点击安装图标 接着出现如图所示: 点击next后按如下步骤: 在"License Agreement"窗口下点击'I Agree',弹出"Choose Components"窗口,点'next' 后弹出"Select Additional Tasks"窗口,点'next'又弹出"Choose Install Location"窗口后再点'next',弹出"Install Winpcap"窗口(选'Install Winpcap4.12')点击'Install',接着弹出"Installing"窗口(在运行时弹出"Winpcap4 .12 Set up"窗口,点击'确定',且在接下来弹出的窗口下按如下步骤点击:next—next—I Agree—Install—finsh),接着点击'next'弹出如下窗口: 并选择'Run Wireshork1.6.3(32bit)'并点击'Finsh': 2.打开wireshark,选择接口选项列表。或单击"Capture",配置"option"选项。 3.设置完成后,点击"start"开始抓包. 显示结果: 4.选择某一行抓包结果,双击查看此数据包具体结构如下: 三.捕捉IP数据包。 数据包信息: 1. 写出IP数据包的格式如下: 2. 将捕捉的IP数据包的分析得出格式图例如下: 3. 针对每一个域所代表的含义进行解释。 IP数据报首部各部分含义: 版本 占4,指IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的 IP协议版本号为4(即IPv4)。 首部长度 占4,可表示的最大十进制数值是15。请注意,这个字段所表示数的单是 32字长(1个32字长是4字节),因此,当IP的首部长度为1111时(即十进制的15) ,首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的 填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为 方便。首部长度限制为60 字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部 区分服务 占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上 一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。 总长度 总长度指首部和数据之和的长度,单字节。总长度字段为16,因此数据 报的最大长度为216- 1=65535字节。长度就是20字节(即首部长度为0101),这时不使用任何选项。 标识(identification) 占16。IP软件在存储器中维持一个计数器,每产生一个数据 报,计数器就加1,并将此值赋给标识字段。但这个"标识"并不是序号,因为IP是无连接 服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时, 这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片 后的各数据报片最后能正确地重装成为原来的数据报。 标志(flag) 占3,但目前只有2有意义。标志字段中的最低记为MF(More Fragment)。MF=1即表示后面"还有分片"的数据报。MF=0表示这已是若干数据报片中的最 后一个。标志字段中间的一记为DF(Don't Fragment),意思是"不能分片"。只有当DF=0时才允许分片。 片偏移 占13。片偏移指出:较长的分组在分片后,某片在原分组中的相对置。也 就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单。这 就是说,每个分片的长度一定是8字节(64)的整数倍。 生存时间 占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防 止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计 是以秒作为TTL的单。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值