Comparing D vs C++ (wierd behaviour of C++)
Ecstatic Coder
ecstatic.coder at gmail.com
Tue Jul 24 14:41:17 UTC 2018
On Tuesday, 24 July 2018 at 14:08:26 UTC, Daniel Kozak wrote:
> I am not C++ expert so this seems wierd to me:
>
> #include <iostream>
> #include <string>
>
> using namespace std;
>
> int main(int argc, char **argv)
> {
> char c = 0xFF;
> std::string sData = {c,c,c,c};
> unsigned int i = (((((sData[0]&0xFF)*256
> + (sData[1]&0xFF))*256)
> + (sData[2]&0xFF))*256
> + (sData[3]&0xFF));
>
> if (i != 0xFFFFFFFF) { // it is true why?
> // this print 18446744073709551615 wow
> std::cout << "WTF: " << i << std::endl;
> }
> return 0;
> }
>
> compiled with:
> g++ -O2 -Wall -o "test" "test.cxx"
> when compiled with -O0 it works as expected
>
> Vs. D:
>
> import std.stdio;
>
> void main(string[] args)
> {
> char c = 0xFF;
> string sData = [c,c,c,c];
> uint i = (((((sData[0]&0xFF)*256
> + (sData[1]&0xFF))*256)
> + (sData[2]&0xFF))*256
> + (sData[3]&0xFF));
> if (i != 0xFFFFFFFF) { // is false - make sense
> writefln("WTF: %d", i);
> }
> }
>
> compiled with:
> dmd -release -inline -boundscheck=off -w -of"test" "test.d"
>
> So it is code gen bug on c++ side, or there is something wrong
> with that code.
As the C++ char are signed by default, when you accumulate
several shifted 8 bit -1 into a char result and then store it in
a 64 bit unsigned buffer, you get -1 in 64 bits :
18446744073709551615.
More information about the Digitalmars-d
mailing list