编译器奇怪问题。

软件和网站开发以及相关技术探讨
回复
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

编译器奇怪问题。

#1

帖子 eexpress » 2012-09-18 14:02

unsigned char i,j;
long ir_data=0;

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

j=~ir_data;
if(i!=j){...}
正常,按照字节比较
● 鸣学
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 编译器奇怪问题。

#2

帖子 枫叶饭团 » 2012-09-18 14:30

我猜神说的不是gcc
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: 编译器奇怪问题。

#3

帖子 YeLee » 2012-09-18 15:41

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

Re: 编译器奇怪问题。

#4

帖子 eexpress » 2012-09-18 15:51

懒虫先给出一个结果。
:em04
我可看过汇编了。
● 鸣学
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: 编译器奇怪问题。

#5

帖子 YeLee » 2012-09-18 15:54

懒得回复了。 :em01 :em01 :em01
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
联系:

Re: 编译器奇怪问题。

#6

帖子 tangboyun » 2012-09-18 17:09

猜的,可能和开优化有关。

可能在第一种情况下,由于有优化,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
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 编译器奇怪问题。

#7

帖子 eexpress » 2012-09-18 21:22

不开优化,所有 char = long的操作,都取4字节,那不害死嘛。
开了-O1优化。

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

你这句没法测试。我是avr-gcc。
● 鸣学
头像
杨钧文
帖子: 143
注册时间: 2012-06-27 19:48
来自: 神奇国度

Re: 编译器奇怪问题。

#8

帖子 杨钧文 » 2012-09-18 22:36

eexpress 写了:unsigned char i,j;
long ir_data=0;

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

j=~ir_data;
if(i!=j){...}
正常,按照字节比较
你爱无前戏。
不知周之夢為胡蝶與,胡蝶之夢為周與?
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
联系:

Re: 编译器奇怪问题。

#9

帖子 tangboyun » 2012-09-19 8:37

那就怪了。正常情况下,整数截断成较小的无符号整数,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
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
回复