打印

讨论 纠结啊!为了防止 出错 是否不用unsigned

[复制链接]
1529|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
itelectron|  楼主 | 2016-6-23 21:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
cuya| | 2016-6-23 21:56 | 只看该作者
你到底想表达什么?

使用特权

评论回复
板凳
lxyppc| | 2016-6-23 22:08 | 只看该作者
为了防止出错不应该用变量
应该用函数式编程
全部数据结构都用函数来表达

使用特权

评论回复
地板
cuya| | 2016-6-23 22:31 | 只看该作者
不同的 CPU, 不同的编译器, int 的宽度不同, 可以是16位, 32位, 甚至是64位, 因此溢出范围不同。long 在不同的编译器下, 可能与 int 等宽, 也可能比 int 大一圈。

因此, 你的问题表述还是有问题。

使用特权

评论回复
5
itelectron|  楼主 | 2016-6-23 23:08 | 只看该作者
cuya 发表于 2016-6-23 22:31
不同的 CPU, 不同的编译器, int 的宽度不同, 可以是16位, 32位, 甚至是64位, 因此溢出范围不同。long  ...

我写漏了补充下

为了防止 出错 是否因该不用unsigned

全部用singed short 超过了32768  用  signed long

使用特权

评论回复
6
ranli55| | 2016-6-23 23:13 | 只看该作者
比如要定义一个变量值可能会到128-255之间时,那就要用到16位而不能用8位这是很大的问题

使用特权

评论回复
7
itelectron|  楼主 | 2016-6-23 23:27 | 只看该作者
但是如果要进行一些运算 还有一些 比较的时候  容易犯错

unsigned short i
if(i<0)//比如这个时候!

使用特权

评论回复
8
itelectron|  楼主 | 2016-6-23 23:28 | 只看该作者
04.int main()  
05.{  
06.    int a = -1;  
07.    unsigned int b = 1;  
08.  
09.    if(a > b)  
10.        printf("a > b, a = %d, b = %u\n", a, b);  
11.    else  
12.        printf("a <= b, a = %d, b = %u\n", a, b);  
13.    exit(0);  
14.}  

还有这个时候

使用特权

评论回复
9
itelectron|  楼主 | 2016-6-23 23:30 | 只看该作者
还有 这个时候

01.float sum_elements(float a[], unsigned length)  
02.{  
03.    int i = 0;  
04.    float sum = 0;  
05.    for(i = 0; i <= length -1; ++i)  
06.        sum += a[i];  
07.    return sum;  
08.}  

使用特权

评论回复
10
itelectron|  楼主 | 2016-6-23 23:33 | 只看该作者
使用unsigned,有时候看起来OK,有时候在的运算 产生非直观的错误,还难发现。

使用特权

评论回复
11
itelectron|  楼主 | 2016-6-23 23:34 | 只看该作者
lxyppc 发表于 2016-6-23 22:08
为了防止出错不应该用变量
应该用函数式编程
全部数据结构都用函数来表达 ...

会降低效率吗?

使用特权

评论回复
12
coody| | 2016-6-23 23:38 | 只看该作者
为了避免手机容易死机,应该禁止卖安卓系统的手机,只允许iphone,因为相对不容易死机。。。。

禁止了unsigned,你能保证程序不出错了?实际上,我觉得大部分的程序出错是在逻辑处理上,计算的错误相对要少得多。
当然,如果你用的是32位或64位的MCU,那全部变量最少都要用long,没问题。可是,8位机呢?别跟我所8位机要被淘汰了。

使用特权

评论回复
13
874692826| | 2016-6-24 01:48 | 只看该作者
unsigned 还是蛮常用的

使用特权

评论回复
14
ayb_ice| | 2016-6-24 08:40 | 只看该作者
为了防止出车祸,是不是应该不出门

使用特权

评论回复
15
cuya| | 2016-6-24 09:41 | 只看该作者
itelectron 发表于 2016-6-23 23:27
但是如果要进行一些运算 还有一些 比较的时候  容易犯错

unsigned short i

为何要犯这种错误? 既然定义为 unsigned, 肯定有一定的作为 unsigned的 原因, 那么为什么还要当作 signed 去处理呢?
if(i<0) 有些编译器会给出警告, 对于这种错误一定要纠正, 而不是遮掩。

使用特权

评论回复
16
huangqi412| | 2016-6-24 10:18 | 只看该作者
单片机  我相信大家更喜欢用个类型宏定义头文件指定u8.  u16之类  用c原始类型有时候会搞晕移植的人   没办法  单片机不比人家码农统一用x86环境 人家各种编译器都一致了

使用特权

评论回复
17
huangqi412| | 2016-6-24 10:23 | 只看该作者
很不习惯看到单片机里面用原始类型   

使用特权

评论回复
18
冰零分子| | 2016-6-24 10:23 | 只看该作者
相反我有个程序中用不到负值,
所有变量都用unsigned定义

使用特权

评论回复
19
huangqi412| | 2016-6-24 10:24 | 只看该作者
专一的搞arm的也不会考虑这种问题   杂七杂八的单片机搞的才会遇到

使用特权

评论回复
20
huarana| | 2016-6-24 11:11 | 只看该作者
99%的情况下都是用unsigned  。只有1%的情况才用 有符号的。  绝大多数时候都是正的啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

274

主题

2762

帖子

8

粉丝