|
To display the ranges of values an unsigned _int64 can have,this is what I wrote:
void myDlg::ShowRanges()
{
unsigned _int64 uValue;
CString uValueStr;
uValue=(unsigned _int64)pow(2,sizeof(unsigned _int64)*8) ;
////////////////////////////////////////////////////////
uValueStr.Format("0 to %I64u",uValue-1);
AfxMessageBox(uValueStr);
}
///////////////////////////////////////////
This is displaying:
0 to 9 223 372 036 854 775 807
instead of the correct answer:
0 to 18 446 744 073 709 551 614
Obviously the answer is truncated by some statment.But where ? In the formatting perhaps?
Thanks for any help.
NB: I added the spaces between the digits to facilitate reading.
|
|
|
|
|
I see two problems here:
1) pow is a floating point function, returning a double, and doubles won't maintain precision to the 20 digits you are expecting.
2) it wouldn't work anyway. You can't represent the range of an integer type as you are doing. For example, think about a byte . That has a sizeof 1, but the range is not 0 to 256, but 0 to 255. Note that 256 will not fit in a byte data type.
The range is actually 0 to 2 to the power of (number of bits) - 1
|
|
|
|
|
If you look in limits.h
#if _INTEGRAL_MAX_BITS >= 64
/* minimum signed 64 bit value */
#define _I64_MIN (-9223372036854775807i64 - 1)
/* maximum signed 64 bit value */
#define _I64_MAX 9223372036854775807i64
/* maximum unsigned 64 bit value */
#define _UI64_MAX 0xffffffffffffffffui64
#endif
Sooooo,
uValueStr.Format("0 to %I64u", _UI64_MAX);
...cmk
Save the whales - collect the whole set
|
|
|
|
|
And that works perfectly.
Thank you so much for your time.
|
|
|
|
|
You could also do :
unsigned _int64 uValue = (unsigned _int64)~0;
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it! Honoured as one of The Most Helpful Members of 2004
|
|
|
|
|
You are right.
I wrote :
void CMyHexDDlg::ShowRangeOfULONGLONG()
{unsigned _int64 uValue = (unsigned _int64)~0;
CString result;
result.Format("0 to %I64u",uValue);
AfxMessageBox(result);
}
and the output is ( as expected ) :
0 to 18446744073709551615
Very elegant ,and fast solution.
Thank you so much for your time.
|
|
|
|
|
I use this little template class:
template <typename T>
class Limits
{
public:
static T min() { return (T)~0 > 0 ? 0 : (T)1 << (sizeof(T) * 8 - 1); }
static T max() { return (T)~0 > 0 ? (T)~0 : (T)~0 & ~((T)1 << (sizeof(T) * 8 - 1)); }
};
unsigned _int64 ui64Max = Limits<unsigned _int64>::max();
_int64 i64Min = Limits<_int64>::min();
char cMin = Limits<char>::min();
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it! Honoured as one of The Most Helpful Members of 2004
|
|
|
|
|
This is a new subject to me.
My hint is taht the class you are defining can be used for all kind of data types(unsigned and signed) to find the minimum and maximum values that can be stored in them.
But if you have time,could you please tell me what header file I must include to use your class ?
Thanks for any help.
|
|
|
|
|
fardak wrote:
could you please tell me what header file I must include to use your class ?
It is plain C++, no header file required.
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it! Honoured as one of The Most Helpful Members of 2004
|
|
|
|
|
I copied the template and class Limits and insert it (as is) in one of my header files of my code
(D:\myPrograms\myHexD\MyDTypeDlg.h)
,and the compiler displayed this list of warnings and errors.(By the way I am using VC++6.0).
warning C4003: not enough actual parameters for macro 'min'
D:\myPrograms\myHexD\MyDTypeDlg.h(17) : warning C4003: not enough actual parameters for macro 'max'
D:\myPrograms\myHexD\MyDTypeDlg.h(15) : error C2059: syntax error : 'function-style cast'
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
D:\myPrograms\myHexD\MyDTypeDlg.h(15) : error C2334: unexpected token(s) preceding ':'; skipping apparent function body
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
D:\myPrograms\myHexD\MyDTypeDlg.h(16) : error C2143: syntax error : missing ')' before '}'
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
D:\myPrograms\myHexD\MyDTypeDlg.h(16) : error C2059: syntax error : ')'
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
D:\myPrograms\myHexD\MyDTypeDlg.h(16) : error C2143: syntax error : missing ';' before '}'
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
D:\myPrograms\myHexD\MyDTypeDlg.h(16) : error C2238: unexpected token(s) preceding ';'
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
D:\myPrograms\myHexD\MyDTypeDlg.h(17) : error C2143: syntax error : missing ';' before 'static'
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
myHexDDlg.cpp
D:\myPrograms\myHexD\MyDTypeDlg.h(15) : warning C4003: not enough actual parameters for macro 'min'
D:\myPrograms\myHexD\MyDTypeDlg.h(17) : warning C4003: not enough actual parameters for macro 'max'
D:\myPrograms\myHexD\MyDTypeDlg.h(15) : error C2059: syntax error : 'function-style cast'
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
D:\myPrograms\myHexD\MyDTypeDlg.h(15) : error C2334: unexpected token(s) preceding ':'; skipping apparent function body
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
D:\myPrograms\myHexD\MyDTypeDlg.h(16) : error C2143: syntax error : missing ')' before '}'
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
D:\myPrograms\myHexD\MyDTypeDlg.h(16) : error C2059: syntax error : ')'
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
D:\myPrograms\myHexD\MyDTypeDlg.h(16) : error C2143: syntax error : missing ';' before '}'
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
D:\myPrograms\myHexD\MyDTypeDlg.h(16) : error C2238: unexpected token(s) preceding ';'
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
D:\myPrograms\myHexD\MyDTypeDlg.h(17) : error C2143: syntax error : missing ';' before 'static'
D:\myPrograms\myHexD\MyDTypeDlg.h(19) : see reference to class template instantiation 'Limits<t>' being compiled
Thanks for any help.
|
|
|
|
|
Sorry, but that is my fault. The functions are named Min and Max, I forgot to capitalize them when I typed them in here. In lower case the way they are now, the compiler substites the function names for the min and max macros defined in WinDef.h so it is trying to compile a line that looks like this:
static T (((a) < (b)) ? (a) : (b)) { return (T)~0 > 0 ?... and it can not find the variables a and b.
So capitalize min() and max() to Min() and Max() and it will work fine.
Sorry about that.
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it! Honoured as one of The Most Helpful Members of 2004
|
|
|
|
|
Pls don't worry.
This is what I wrote and got the (correct) result:
void CMyHexDDlg::Temp()
{ CString result;
unsigned _int64 ui64Max=Limits<unsigned _int64="">::Max();
result.Format("Max:%I64u",ui64Max);
AfxMessageBox(result);
_int64 i64Min=Limits<_int64>::Min();
result.Format("Min:%I64i",i64Min);
AfxMessageBox(result);
char cMin=Limits<char>::Min();
result.Format("Min:%i",cMin);
AfxMessageBox(result);
}
///////////////////////////////////////////
The output of the three message boxes is:
Max: 18446744073709551615
Min: -9223372036854775808
Min:-128
The code is very subtle and very interesting.
May I add that you are a supestar alright.
Thank you so much for your time and effort.
|
|
|
|
|
I have difficulty with one part of this statement and I hope you give me a hand there.
static T Max()
{ return (T)~0 > 0 ? (T)~0 : (T)~0 & ~((T)1 << (sizeof(T) * 8 - 1)); }
/////////////////////////////////////////
Say I have a WORD:
00000000 00000000
If it is a UWORD (HOB set to 1) return
11111111 11111111
If it is a WORD (HOB set to -)
transform it to
11111111 11111111
and AND it with what exactly ?
Bearing in mind that: 1<< (sizeof(T)*8-1) is:
10000000 00000000
Thanks for any help.
|
|
|
|
|
http://www.codeproject.com/cpp/bitbashing.asp[^]
In a signed value the high order bit(HOB) is the sign bit, it is zero for positive numbers and one for negative numbers. In unsigned values the HOB has no special significance.
So what is done is to first check if we are dealing with a signed or unsigned value by checking if ~0 (inverse zero) is greater than zero. For signed values ~0 will give you -1 (minus one), for unsigned values it will give you the largest possible value.
So for unsigned values we can simply return ~0.
But for signed values, we have to clear the HOB (set it zero) to get the largest possible value
ie:
BYTE bMax = Limits<BYTE>::Max();
will do the following calculations:
(T)~0 > 0 ?
00000000 inversed is 11111111
is 11111111 greater than zero?
No, it is minus one, so it is less than zero.
So we have to return: (T)~0 & ~((T)1 << (sizeof(T) * 8 - 1))
00000000 inversed is 11111111
00000001 left shifted 1 * 8 - 1 (or 7) is 10000000
10000000 inversed is 01111111
11111111 bitwise and 01111111 is 01111111
So we can return 01111111, the largest possible signed value.
And now that I have gone through the exercise of explaining it this way, I realize that I can simplify the function a little. The last step with the bitwise and can be eliminated. The function can be
static T Max() { return (T)~0 > 0 ? (T)~0 : ~((T)1 << (sizeof(T) * 8 - 1)); }
Thanks for putting me through this exercise
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it! Honoured as one of The Most Helpful Members of 2004
|
|
|
|
|
I am really thankfull fo your time,experience and generousity.
My mistake is that I missed the fact that the NOT(~) opeator inverses the bits state.
So applying it to : 10000000 00000000
The Operand becomes: 01111111 11111111
That AND_ ed with : 11111111 11111111
becomes : 01111111 11111111
(whic is 32767 decimal)
I learnt many very useful tricks with you.
Thank you sooooooooooo muuuuuuuuuuuuuuuuuuch.
|
|
|
|
|
Hi
A client server application that uses Winsock2 for communication.
Q1.
Is a single recv() in response to a single FD_READ message appropriate OR the
recv() must be called in a loop untill all data is received.
Q2.
Lets say the server needs to send 1000 bytes of data to the client but at a time
only 100 bytes.
Now there are two ways:
1----> The server calls send() in a loop & donot cares whether data reaches the client or not.
2----> The server calls send() in a loop & after every send() it waits for the client's
notification that the data is received, now send next lot of 100 bytes.
Waiting for suggestions
Best Regards
|
|
|
|
|
A1. you have do continuously received the data in loop.
A2. You should be aware of which format server (syn or asyn) is sending the data and respond accordingly by checking the data termination condition.
|
|
|
|
|
The server is an asynchronous server.
|
|
|
|
|
Hi,
I am using Visual studio .NET 2002. Sometimes when I try opening a cpp file, my Visual studio seems to be hanging. It will take 7-8 mins to open the file.
SO what I usually do is I will delete the .ncb file (the database file for the solution).
Then the performance will be good enough at the cost of not getting the drop downs in the editor (list of methods, data members etc).
Any ideas as to why should it hang?
Thanks
|
|
|
|
|
PrashantJ wrote:
Any ideas as to why should it hang?
You require more Memory in your Computer!
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
|
|
|
|
|
Upgrade to microsoft less hanging version, like Visual Studio 6.0
My idea is to create a new project by wizard (not a empty one) and remove the cpp and h from it, and add your files to the project. And then compile the project. Just try it, it works many times for me.
http://www.priyank.in/
|
|
|
|
|
Hey all,
I am new to this forum. Wish I was good at programming , so i cud have posted the solutions...unfortunately, I am not...Instead I have my own query....and am desperately seeking help...
I have this assignment submission next week. I have no idea about the logic for this assignment. My assignment is as follows:
*********************************************
Text segmentation from images with scenery + text. Obtain at least 10 images from newspapers, magazines etc. Some should be color. (3 min) Scan them as necessary. Devise three segmentation techniques to separate letters from background. Methods should be essentially automatic in operation. Methods: may include :Thresholding Local or Global, Color. Geometric Features, Texture
*************************************************
Can anyone help me out with the logic for this program? This thing is in C++. All I have done is binarise the input image.But I dont know how to proceed. Please help me out guys.
Cheers,
Raj
|
|
|
|
|
|
I write a console program that connect 2 computers with socket, like a chat program. I try to use the commands that use windows socket v1.1 only because I don't sure Windows NT Server 3.51 support windows socket v2 or not. When I test with 2 Windows XP, it works very well. But when I test with a Windows XP and a Windows NT Server 3.51, It doesn't work both Windows XP be a server and a client. Client side tells me "Could not get host by address", but no run time error.
I think the problem is compiling. I don't know how to do. Please give me some suggestions about setting the compiler or the other method to solve this problem. Thank you very much.
|
|
|
|
|
Does anyone here want an article explaining how to write a 2D graphics game engine using DirectX 9? I don't have alot of time but if someone wants I can spare some time to write an article. Need a reply if you want me to make the article.
IM PROUD TO BE A GMAIL;
|
|
|
|