Hi,
static_cast<unsigned short&>(long_type);
4 different compilers - 3 different behaviors for that statement.
Regards,
Alex Vinokur
// ============ cast_test.cpp (BEGIN) ============
#include<cstdlib>
#include<iostream>
#include<iomanip>
bool isBigEndian()
{
unsigned short sh = 1;
char* ch = reinterpret_cast<char*>(&sh);
return (0 == *ch);
}
// ---------------
void showCompiler()
{
#if defined __hpux
system ("aCC -V");
#elif defined _AIX
system ("xlC -qversion");
#elif defined __sun
system ("CC -V");
#elif (defined __linux&& defined __INTEL_COMPILER)
system (" icpc -V");
#else
#error Undefined platform
#endif
}
// ---------------
void showEnv()
{
std::cout<< std::endl;
system ("uname -a");
std::cout<< std::endl;
showCompiler();
std::cout<< std::endl;
std::cout<< "sizeof(long) = "<< sizeof(long)<< std::endl;
std::cout<< std::endl;
std::cout<< "ENDIAN: "<< (isBigEndian() ? "BIG" : "LITTLE")<<
std::endl;
std::cout<< std::endl;
}
// -------------
void castTest()
{
#define SHOW(x) std::cout<< std::setw(2)<< std::left<< #x<<
std::right<< " = "<< std::hex<< std::showbase<< x<< std::dec<<
std::endl
unsigned long l = 0x13579bdf2458ace0;
unsigned short s1 = static_cast<unsigned short>(l);
unsigned short s2 = static_cast<const unsigned short&>(l);
unsigned short s3 = static_cast<const unsigned
short&>(static_cast<const unsigned long&>(l));
unsigned short s4 = reinterpret_cast<const unsigned short&>(l);
unsigned short s5 = reinterpret_cast<const unsigned
short&>(static_cast<const unsigned long&>(l));
SHOW(l);
SHOW(s1);
SHOW(s2);
SHOW(s3);
SHOW(s4);
SHOW(s5);
}
int main()
{
showEnv();
castTest();
return 0;
}
// ============ cast_test.cpp (END) ============
Compilation and running
// ====== cast test on HP-UX ======
aCC +DD64 -AA cast_test.cpp
// No errors
HP-UX hpx418 B.11.23 U ia64 1139467043 unlimited-user license
aCC: HP C/aC++ B3910B A.06.25.01 [May 16 2010]
sizeof(long) = 8
ENDIAN: BIG
l = 0x13579bdf2458ace0
s1 = 0xace0
s2 = 0xace0
s3 = 0xace0
s4 = 0x1357
s5 = 0x1357
// ====== cast test on SUN ======
// No errors
SunOS ilsun015 5.10 Generic_139555-08 sun4u sparc SUNW,SPARC-
Enterprise
CC: Sun C++ 5.10 SunOS_sparc 128228-08 2010/04/21
Usage: CC [ options ] files. Use 'CC -flags' for details
sizeof(long) = 8
ENDIAN: BIG
l = 0x13579bdf2458ace0
s1 = 0xace0
s2 = 0x1357
s3 = 0x1357
s4 = 0x1357
s5 = 0x1357
// ====== cast test on AIX ======
xlC -q64 -qwarn64 cast_test.cpp
// No errors
AIX ep5512b 1 6 000497A2D900
IBM XL C/C++ for AIX, V10.1
Version: 10.01.0000.0000
sizeof(long) = 8
ENDIAN: BIG
l = 0x13579bdf2458ace0
s1 = 0xace0
s2 = 0xace0
s3 = 0xace0
s4 = 0x1357
s5 = 0x1357
// ====== cast test on Linix& INTEL-compiler ======
Linux illin025 2.6.18-92.1.22.el5 #1 SMP Fri Dec 5 09:28:22 EST 2008
x86_64 x86_64 x86_64 GNU/Linux
Intel(R) C++ Intel(R) 64 Compiler Professional for applications
running on Intel(R) 64, Version 11.0 Build 20090318 Package ID:
l_cproc_p_11.0.083
Copyright (C) 1985-2009 Intel Corporation. All rights reserved.
cast_test.cpp(58): error: invalid type conversion: "unsigned long *"
to "const unsigned short&"
unsigned short s2 = static_cast<const unsigned short&>(l);
^
cast_test.cpp(59): error: invalid type conversion: "const unsigned
long *" to "const unsigned short&"
unsigned short s3 = static_cast<const unsigned
short&>(static_cast<const unsigned long&>(l));
^
compilation aborted for cast_test.cpp (code 2)
Copyright 1988-2008 Comeau Computing. All rights reserved.
2 errors detected in the compilation of "ComeauTest.c".