搜索
bottom↓
回复: 52

中兴的一个笔试题目,,,short s1=1;s1=s1+1; 有什么错误,,,搞单片机的差不多做不出

[复制链接]

出0入0汤圆

发表于 2009-11-8 22:23:00 | 显示全部楼层 |阅读模式
搞单片机的一般做不出来,,
我用KEIL试了下,没出错,,
用ADS试了下,也没出错,,


搜了下答案...
是类型错误,,,


S1+1就成了int 型了,,,

S1是SHORT型,,,

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-11-8 22:30:10 | 显示全部楼层
汗……这么隐蔽……

出0入0汤圆

发表于 2009-11-8 22:33:06 | 显示全部楼层
我觉得这种题目很无聊
在编译优化下,S1=2,已经自动按照常量处理了~

出0入0汤圆

发表于 2009-11-8 23:27:25 | 显示全部楼层
坦白的说,到现在我还没弄懂~~

出0入0汤圆

发表于 2009-11-8 23:50:25 | 显示全部楼层
关注。

出0入0汤圆

发表于 2009-11-8 23:54:50 | 显示全部楼层
不对,楼主的答案有问题吧。我在visual studio 2005下试验,没觉出有什么区别。


#include <stdio.h>

int main()
{
    short s;
    long  l;

    s = 1, l = 0;
    s = s+1;
    l = l+1;

    return 0;
}

调试断点观察变量,s是0x0002,l是0x00000001,说明s还是16位的啊!

出0入0汤圆

发表于 2009-11-9 06:20:10 | 显示全部楼层
s = s+1;
相当于:
s = (short)((int)((int)s+(int)1));

整型提升,类型转换时自动进行的,

个人认为没问题。

出0入42汤圆

发表于 2009-11-9 06:45:49 | 显示全部楼层
貌似没什么问题,只是里面有个变int再截短成short的问题.

出0入0汤圆

发表于 2009-11-9 08:23:13 | 显示全部楼层
int和short本就是要看编译器的,KEIL里编51程序int就是16位,arm下才是32位。

这个区别确实能考到不少初学C的新人,但对于有点经验的,都会注意。出题人也许编程能力很高,但想当老师考人,还差的远。

出0入0汤圆

发表于 2009-11-9 08:39:13 | 显示全部楼层
百度到的“short占2个字节,int占4个字节,short型变量+上int型值计算结果是int型,占4个字节,然后付给一个short型变量s1,就要丢失2个字节的精度,这是不容许的。”

前提是  java 中。。。。。。

出0入0汤圆

发表于 2009-11-9 10:47:01 | 显示全部楼层
这题目的确没啥意义
和编译器有关的嘛

出0入0汤圆

发表于 2009-11-9 10:49:12 | 显示全部楼层
考这种题目,确实不是很好。。。

出0入0汤圆

发表于 2009-11-9 11:00:36 | 显示全部楼层
我出题就这样:列举一个你所做的认为最得意的设计,说明得意点,列举你做出的一个大多人都忽略的而你注意到的问题

出0入0汤圆

发表于 2009-11-9 12:51:56 | 显示全部楼层
这个貌似没有问题啊。

出0入0汤圆

发表于 2009-11-9 23:44:54 | 显示全部楼层
支持8楼:
int和short本就是要看编译器的,KEIL里编51程序int就是16位,arm下才是32位。


前段时间负责产品的单片机程序接受软件测试,他们也为我程序里面类似这样的情况纠缠了一阵,我跟他们解释我这里int是16位的,他们还有点不理解。还有他们问我为什么总是把变量定义成unsigned char型,我说是因为我这是单片机,不是PC...

出0入0汤圆

发表于 2009-11-10 08:26:33 | 显示全部楼层
冷僻题
文字游戏

出0入0汤圆

发表于 2009-11-10 08:45:40 | 显示全部楼层
考官要的是自己的成就感:看见了吧,你们都不会,这样就被我难倒了……

出0入0汤圆

发表于 2009-11-10 09:38:30 | 显示全部楼层
考官真的很无知。

出0入0汤圆

发表于 2009-11-10 09:48:14 | 显示全部楼层
未必。。。
即使不考虑可移植性 这也是个隐患!!
养成良好的习惯 特别在现在 8/32位处理器都用的年代 :)
因为有时候可能因为你把上礼拜写8位机代码的坏毛病带到32位系统上。。。。

出0入0汤圆

发表于 2009-11-11 14:24:09 | 显示全部楼层
我认为这样的题可以去考在校的大学生,检查他们基础支持的掌握情况,但是考工程师没有意义。

出0入0汤圆

发表于 2009-11-11 14:42:31 | 显示全部楼层
I think this is will get not any error,because the compiler will detect the type short for any compiler will be
16 bit(depend on system),but the S1=S1+1 ,, the 1 is const so what ever this,this type the compiler will for short int or unsiged int,or long this will have not any error,

出0入0汤圆

发表于 2009-11-11 15:02:03 | 显示全部楼层
楼上这么NB,用火星文呀~

出0入0汤圆

发表于 2009-11-11 15:02:17 | 显示全部楼层
楼上这么NB,用火星文呀~

出0入0汤圆

发表于 2009-11-11 15:02:27 | 显示全部楼层
楼上这么NB,用火星文呀~

出10入0汤圆

发表于 2009-11-11 15:18:09 | 显示全部楼层
在KEIL下SHORT和INT是不一样的。

有一次因为这个整了半天程序。

出0入0汤圆

发表于 2009-11-11 22:28:31 | 显示全部楼层
在KEIL下SHORT和INT是不一样的。

有一次因为这个整了半天程序。



能把您因为这个引起的错误讲一下么,

我觉得6L

s = (short)((int)((int)s+(int)1))是正确的,这么看不会出现什么错误的。

出0入0汤圆

发表于 2009-11-11 22:33:38 | 显示全部楼层
光看这出的考题就知道中兴的产品为什么总是那么烂了

出0入0汤圆

发表于 2009-11-11 22:53:08 | 显示全部楼层
下面的图是我在keil c51 vision2 v2.40a截下来的:

(原文件名:未命名.jpg)

可以看到int和short是一样的,但是最近我在用KEIL ARM RealView,我清楚的记得它对short是16位,而int是32位。

出0入0汤圆

发表于 2009-11-11 22:57:14 | 显示全部楼层
25楼,有的是人在国外,有的是压根公司电脑规定就只能是英文系统。

STM32的库使用了如u8、u16之类的类型定义,避免编译器的问题。
byte和word也可以拿来用,受例程的影响我CodeWarrior里的程序全是用byte和word定义。
写BCB的程序时,考虑到CPU和系统,所以类型定义用的很小心。试过的,int在BCB里是64位的。
PIC用汇编写,16位乘8位少许溢出时可以定义结果为24位数,比习惯性的定义32位数要好的多。

如22楼所说,如果上下位机都做或换了编译器的时候不搞清是不行的。也如23楼说的这些东西就只能是考考学生,实际工作后,工作会逼这你记住的……。

出0入0汤圆

发表于 2009-11-11 23:03:52 | 显示全部楼层
s = s+1;  
相当于:
s = (short)((int)((int)s+(int)1));  

整型提升,类型转换时自动进行的,

个人认为没问题。
//////////////////////////////////////////////////
楼上的已经分析的很清楚了,就是有一个整形提升再截短的问题,难道说考官认为这么写也是一种错误?如果是,这样的代码应该怎么写?真要分析这方面的问题,可以看看这个题目中result_8的结果:
uint8_t port = 0x5a ;
uint8_t result_8 ;
result_8 = (~port) > > 4 ; /*注:uint8_t表示8位无符号整型*/
这是嵌入式C 标准研究报告(一)
---MISRA C标准工程师笔记 中的文件贴在下面
MISRAC 研究报告ourdev_502431.pdf(文件大小:425K) (原文件名:20070817115825_MISRAC.pdf)

出0入0汤圆

发表于 2010-1-12 20:20:16 | 显示全部楼层
相当于以前的文字_狱.s1=s1+1 ,最多是给个警告,出错就太不应该了.

出0入0汤圆

发表于 2010-1-12 20:32:30 | 显示全部楼层
又见到这个帖子了,标记下吧

出0入0汤圆

发表于 2010-1-12 21:40:58 | 显示全部楼层
是有点像文字_狱。似乎想说short型变量不可以做加减运算。不理解。

出0入0汤圆

发表于 2010-1-12 22:31:32 | 显示全部楼层
short s1=1;
s = s+1;
等于:
u16 s1=1;
s++;
或:
s=2;
s无论咋样加,溢出了也是short
跟int(u32)转换扯不上任何关系,语法没有任何错误。
出题者自己都没整明白,很无聊,可笑。

出280入168汤圆

发表于 2010-1-12 22:43:05 | 显示全部楼层
各位大侠没说错,出题者自己陷在某个纠结之中,拿来考别人很可笑。

不管在哪个编译器下,本人都甚少使用 int 变量,不是怕出错,而是为了移植代码方便。

16bit 用 short 、32bit 用 long ,这样不管在什么编译器下都明确无误。

出0入0汤圆

发表于 2010-1-13 08:45:10 | 显示全部楼层
关键是相加的两个数值太小了,类型提升后,再截断,一般也不会出什么问题,关键可能出在符号位的问题

类型提升,各个编译器都不一样,这个还是要注意的

按MISRA-C的规定,这种情况是不需要显式转换的。

出0入0汤圆

发表于 2010-1-13 15:12:26 | 显示全部楼层
关注

出0入0汤圆

发表于 2010-2-4 12:22:32 | 显示全部楼层
关注

出0入0汤圆

发表于 2010-2-4 13:36:12 | 显示全部楼层
其实出题者是在考编程风格,大公司非常重视这点。当然有时重视的有点过头了,导致出来这样有点“偏激”的题目。
其实也不能算偏激,这些隐性转换造成的bug是非常难找的。
例如我同事遇到的一个问题,一段软件模拟SPI的函数,原来平台的GPIO的设置函数是gpio_set( int ),新平台的驱动变成了gpio_set( short )。这样用下面的代码发数据时就会在新平台上有问题。
for( i=0; i<32; i++)
{
    gpio_set( data & (1<<i) );
}
原本想gpio_set的参数为0则置低,非0则置高,没想到在新平台上传参数时高16位被截掉了,到置高16位一直为0。凑巧的是在应用程序中发的一串数据中前面的数据高16位都为0,用示波器与原来的平台比较发现不了问题。在走了不少弯路后,最后用逻辑分析仪抓了整个数据包,才发现后面用到高16位的数据都没发出来。
我想发数据的代码改成下面这样会好点,至少不会出上面的问题,虽然写起来麻烦点。
for( i=0; i<32; i++)
{
    if( data & (1<<i) )
    {
        gpio_set( 1 );
    }
    else
    {
        gpio_set( 0 );
    }
}
所以编程时一定要小心小心再小心,谨慎谨慎再谨慎。尽量少用最好不用C语言隐性的类型转换,默认的表达式优先级等。良好的变成风格是写出好代码的基本功。

出0入0汤圆

发表于 2010-2-4 19:14:20 | 显示全部楼层
这是扯,根本不该这么写函数

出0入0汤圆

发表于 2010-2-5 19:51:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-5 22:53:07 | 显示全部楼层
谁会这样写代码,如果这样写代码的人纯粹是吃饱了想找事。

出0入0汤圆

发表于 2010-2-24 04:21:50 | 显示全部楼层
能看出类型自动提升的,适合搞嵌入式,看不出来的,还是单片机初级水平,s1=s1+1和s1++差别甚远

出0入0汤圆

发表于 2010-2-24 08:25:42 | 显示全部楼层
这是个基本问题.先提升到int型做运算,最后又将恢复short,当然,前提是不优化.一般情况下,这种东西根本不用在意.

出0入0汤圆

发表于 2010-3-5 08:52:46 | 显示全部楼层
赞同楼上的说法.

出0入0汤圆

发表于 2010-3-5 09:17:43 | 显示全部楼层
void main (void)  
{
        unsigned long temp;
    unsigned char n=0xff;

        temp = n*10/2+20;

        if(temp>0x3ff)
                delay();
       
        while(1)
        {
                ;
        }
}



看看最后temp等于几???

出0入0汤圆

发表于 2010-6-28 14:32:10 | 显示全部楼层
无聊的问题,结果是一样的,如果这都不让写,就只能所有的前面都加强制转换了 。。。。

出0入0汤圆

发表于 2010-6-28 14:49:46 | 显示全部楼层
想起了本山的:
    树上Qi个猴,树下1个猴,总共几个猴。

如果真是中兴人力出此题,则效果不好,需改进。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 10:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表