why implicitly allowing compare ubyte and byte sucks
davidl
davidl at nospam.org
Wed Jun 10 21:38:12 PDT 2009
ubyte func()
{
return 255;
}
const byte VAR = cast(byte)0xff;
void main()
{
assert(func == VAR);
assert(255 == VAR);
}
even if you take a look at the ASM( if not carefully enough ), you might
still be fooled in some chances.
testcmp.d:10 assert(func == VAR);
0040201b: e8f0ffffff call 0x402010 testcmp.func testcmp.d:1
00402020: 0fb6c0 movzx eax, al
00402023: 83f8ff cmp eax, 0xff
00402026: 740a jz 0x402032 _Dmain testcmp.d:11
00402028: b80a000000 mov eax, 0xa
0040202d: e80e000000 call 0x402040 testcmp.__assert
testcmp.d:11 assert(255 == VAR);
00402032: b80b000000 mov eax, 0xb
00402037: e804000000 call 0x402040 testcmp.__assert
testcmp.d:12 }
0040203c: 5d pop ebp
0040203d: c3 ret
It seems that comparing two different operands with different size makes
no sense. The compiler should issue an error against that.
Comparing ubyte to byte may lead one to think they are compared in the
sense of the same size.
This behavior doesn't consist with int and uint:
int j=-1;
assert(j==uint.max); // this test passes
byte k=-1;
assert(k==ubyte.max); // this test fails
This inconsistent behavior is pretty nasty.
--
使用 Opera 革命性的电子邮件客户程序: http://www.opera.com/mail/
More information about the Digitalmars-d
mailing list