当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 编译器奇怪问题。
帖子发表于 : 2012-09-18 14:02 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
unsigned char i,j;
long ir_data=0;

j=ir_data;
if(i!=~j){...}
不正常,按照双字节比较

j=~ir_data;
if(i!=j){...}
正常,按照字节比较


_________________
● 鸣学


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 编译器奇怪问题。
帖子发表于 : 2012-09-18 14:30 
头像

注册: 2010-06-16 1:05
帖子: 14668
地址: Tencent
系统: Mac OS X
送出感谢: 1
接收感谢: 153
我猜神说的不是gcc


_________________
twitter求fo:http://twitter.com/maplebeats
博客求踩:http://maplebeats.com


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 编译器奇怪问题。
帖子发表于 : 2012-09-18 15:41 
头像

注册: 2008-08-13 8:48
帖子: 26391
地址: 东海硇州,一双管钥。
系统: Fundu i64
送出感谢: 50
接收感谢: 344
真懒。 :em01


_________________
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 编译器奇怪问题。
帖子发表于 : 2012-09-18 15:51 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
懒虫先给出一个结果。
:em04
我可看过汇编了。


_________________
● 鸣学


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 编译器奇怪问题。
帖子发表于 : 2012-09-18 15:54 
头像

注册: 2008-08-13 8:48
帖子: 26391
地址: 东海硇州,一双管钥。
系统: Fundu i64
送出感谢: 50
接收感谢: 344
懒得回复了。 :em01 :em01 :em01


_________________
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 编译器奇怪问题。
帖子发表于 : 2012-09-18 17:09 
头像

注册: 2009-07-25 1:57
帖子: 701
送出感谢: 5
接收感谢: 13
猜的,可能和开优化有关。

可能在第一种情况下,由于有优化,j=ir_data;这步赋值没做。然后在条件判断时先生成一个临时long变量取反后再截断为unsigned char时,符号位没保留。

楼主你都看过汇编了应该知道答案了,说说阿。

另: 我想问下楼主,你那编译器下
long(-1) % (long(std::numeric_limits<unsigned char>::max()) + 1) 结果是多少,等于255么?


_________________
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 编译器奇怪问题。
帖子发表于 : 2012-09-18 21:22 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
不开优化,所有 char = long的操作,都取4字节,那不害死嘛。
开了-O1优化。

看了汇编,还是不明白为啥。

你这句没法测试。我是avr-gcc。


_________________
● 鸣学


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 编译器奇怪问题。
帖子发表于 : 2012-09-18 22:36 
头像

注册: 2012-06-27 19:48
帖子: 143
地址: 神奇国度
送出感谢: 0 次
接收感谢: 3
eexpress 写道:
unsigned char i,j;
long ir_data=0;

j=ir_data;
if(i!=~j){...}
不正常,按照双字节比较

j=~ir_data;
if(i!=j){...}
正常,按照字节比较

你爱无前戏。


_________________
不知周之夢為胡蝶與,胡蝶之夢為周與?


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 编译器奇怪问题。
帖子发表于 : 2012-09-19 8:37 
头像

注册: 2009-07-25 1:57
帖子: 701
送出感谢: 5
接收感谢: 13
那就怪了。正常情况下,整数截断成较小的无符号整数,c标准里应该是有定义的阿。

让你测试的那句就是按照c标准定义的,测试先转型再截断和先截断再转型有否区别。
3.9.1 Fundamental types (Page 54)

Unsigned integers, declared unsigned, shall obey the laws of arithmetic modulo 2n where n is the number of bits in the value representation of that particular size of integer.41)
...
41) This implies that unsigned arithmetic does not overflow because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting unsigned integer type.

理论上那两句应该没差别,我也想不通了。


_________________
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译