473,382 Members | 1,420 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,382 software developers and data experts.

unsigned char *

#include <stdio.h>

int main(void)
{
long dword = 0xff;

printf("%u\n", ((unsigned char *)&dword)[0]);
return 0;
}

does the standard say this is legal?
if so or if not, what section?
Nov 14 '05 #1
13 2124
In 'comp.lang.c', j0******@engineer.com (j0mbolar) wrote:
#include <stdio.h>

int main(void)
{
long dword = 0xff;

printf("%u\n", ((unsigned char *)&dword)[0]);
return 0;
}

does the standard say this is legal?
if so or if not, what section?


No. An unsigned char will be converted to an int, but "%u" wants an unsigned
int. The behaviour is undefined.

#include <stdio.h>

int main(void)
{
long dword = 0xff;

printf("%u\n", (unsigned) ((unsigned char *)&dword)[0]);
return 0;
}

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=c99
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
Nov 14 '05 #2
On 29 Jun 2004 10:00:49 GMT, Emmanuel Delahaye <em**********@noos.fr>
wrote in comp.lang.c:
In 'comp.lang.c', j0******@engineer.com (j0mbolar) wrote:
#include <stdio.h>

int main(void)
{
long dword = 0xff;

printf("%u\n", ((unsigned char *)&dword)[0]);
return 0;
}

does the standard say this is legal?
if so or if not, what section?

No. An unsigned char will be converted to an int, but "%u" wants an unsigned
int. The behaviour is undefined.


An unsigned char will be converted to signed int on many platforms,
but to unsigned int on some where sizeof(int) == 1. There are such
platforms, mostly Digital Signal Processors and some exotic RISC
architectures. You may not have encountered them, but I work on them
regularly.

So if the code is compiled on such a platform (such as the TI 2812 DSP
I am working on currently), the result is perfectly defined.
#include <stdio.h>

int main(void)
{
long dword = 0xff;

printf("%u\n", (unsigned) ((unsigned char *)&dword)[0]);
return 0;
}


Of course the above is much more portable.

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.contrib.andrew.cmu.edu/~a...FAQ-acllc.html
Nov 14 '05 #3
On 29 Jun 2004 02:27:50 -0700, j0******@engineer.com (j0mbolar) wrote
in comp.lang.c:
#include <stdio.h>

int main(void)
{
long dword = 0xff;

printf("%u\n", ((unsigned char *)&dword)[0]);
return 0;
}

does the standard say this is legal?
if so or if not, what section?


It is not legal except on platforms where sizeof(int) == 1, and there
are some of those but not in the desk top world.

In most common implementations, signed int can hold all possible
values of unsigned char, so the value is converted to signed int, not
unsigned int which the "%u" conversion specifier requires.

The C standard suggests that signed and unsigned integer types should
be acceptable substitutions for each other in function calls, but does
guarantee that this is so.

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.contrib.andrew.cmu.edu/~a...FAQ-acllc.html
Nov 14 '05 #4
"Jack Klein" <ja*******@spamcop.net> wrote in message
news:r6********************************@4ax.com...
On 29 Jun 2004 10:00:49 GMT, Emmanuel Delahaye <em**********@noos.fr>
wrote in comp.lang.c:
In 'comp.lang.c', j0******@engineer.com (j0mbolar) wrote:
#include <stdio.h>

int main(void)
{
long dword = 0xff;

printf("%u\n", ((unsigned char *)&dword)[0]);
return 0;
}

does the standard say this is legal?
if so or if not, what section?

No. An unsigned char will be converted to an int, but "%u" wants an unsigned
int. The behaviour is undefined.


An unsigned char will be converted to signed int on many platforms,


Indeed.
but to unsigned int on some where sizeof(int) == 1.
ITYM: _all_ where sizeof(int) == 1.

The precise criteria for promotion to unsigned int is, of course...

UCHAR_MAX > INT_MAX
There are such
platforms, mostly Digital Signal Processors and some exotic RISC
architectures. You may not have encountered them, but I work on them
regularly.

So if the code is compiled on such a platform (such as the TI 2812 DSP
I am working on currently), the result is perfectly defined.
#include <stdio.h>

int main(void)
{
long dword = 0xff;

printf("%u\n", (unsigned) ((unsigned char *)&dword)[0]);
return 0;
}


Of course the above is much more portable.


It's portable, but not very useful as is. The printed value is unspecified.

--
Peter
Nov 14 '05 #5
Jack Klein a écrit :
No. An unsigned char will be converted to an int, but "%u" wants an unsigned
int. The behaviour is undefined.

An unsigned char will be converted to signed int on many platforms,
but to unsigned int on some where sizeof(int) == 1. There are such
platforms, mostly Digital Signal Processors and some exotic RISC
architectures. You may not have encountered them, but I work on them
regularly.

So if the code is compiled on such a platform (such as the TI 2812 DSP
I am working on currently), the result is perfectly defined.


The lack of portability makes such a construct an undefined behaviour:

3.4.3

1 undefined behavior

behavior, upon use of a *nonportable* or erroneous program construct or
of erroneous data, for which this International Standard imposes no
requirements.

--
Richard
Nov 14 '05 #6
Jack Klein <ja*******@spamcop.net> wrote in message news:<tp********************************@4ax.com>. ..
On 29 Jun 2004 02:27:50 -0700, j0******@engineer.com (j0mbolar) wrote
in comp.lang.c:
#include <stdio.h>

int main(void)
{
long dword = 0xff;

printf("%u\n", ((unsigned char *)&dword)[0]);
return 0;
}

does the standard say this is legal?
if so or if not, what section?


It is not legal except on platforms where sizeof(int) == 1, and there
are some of those but not in the desk top world.

In most common implementations, signed int can hold all possible
values of unsigned char, so the value is converted to signed int, not
unsigned int which the "%u" conversion specifier requires.

The C standard suggests that signed and unsigned integer types should
be acceptable substitutions for each other in function calls, but does
guarantee that this is so.


well, I was more concerned with the
casting to unsigned char *
Nov 14 '05 #7
In <r6********************************@4ax.com> Jack Klein <ja*******@spamcop.net> writes:
On 29 Jun 2004 10:00:49 GMT, Emmanuel Delahaye <em**********@noos.fr>
wrote in comp.lang.c:
In 'comp.lang.c', j0******@engineer.com (j0mbolar) wrote:
> #include <stdio.h>
>
> int main(void)
> {
> long dword = 0xff;
>
> printf("%u\n", ((unsigned char *)&dword)[0]);
> return 0;
> }
>
> does the standard say this is legal?
> if so or if not, what section?
>
No. An unsigned char will be converted to an int, but "%u" wants an unsigned
int. The behaviour is undefined.


An unsigned char will be converted to signed int on many platforms,
but to unsigned int on some where sizeof(int) == 1. There are such
platforms, mostly Digital Signal Processors and some exotic RISC
architectures. You may not have encountered them, but I work on them
regularly.


Do they have *conforming* *hosted* implementations, to be relevant in the
context of Emmanuel's comments: the %u conversion specifier of printf?
So if the code is compiled on such a platform (such as the TI 2812 DSP
I am working on currently), the result is perfectly defined.


If the implementation is not hosted, calling printf without defining it
invokes undefined behaviour, anyway. Anything the C standard says about
printf is irrelevant on such an implementation.

Dan
--
Dan Pop
DESY Zeuthen, RZ group
Email: Da*****@ifh.de
Nov 14 '05 #8
In <tp********************************@4ax.com> Jack Klein <ja*******@spamcop.net> writes:
On 29 Jun 2004 02:27:50 -0700, j0******@engineer.com (j0mbolar) wrote
in comp.lang.c:
#include <stdio.h>

int main(void)
{
long dword = 0xff;

printf("%u\n", ((unsigned char *)&dword)[0]);
return 0;
}

does the standard say this is legal?
if so or if not, what section?


It is not legal except on platforms where sizeof(int) == 1, and there
are some of those but not in the desk top world.


Care to mention ONE conforming hosted implementation with sizeof(int) == 1
???

It would break tons of existing code that assumes that EOF is different
from any byte value:

while ((c = getc(fp)) != EOF) /* do whatever */ ;

Dan
--
Dan Pop
DESY Zeuthen, RZ group
Email: Da*****@ifh.de
Nov 14 '05 #9
In <40*********************@news.club-internet.fr> Richard Delorme <ab****@nospam.fr> writes:
Jack Klein a écrit :
No. An unsigned char will be converted to an int, but "%u" wants an unsigned
int. The behaviour is undefined.

An unsigned char will be converted to signed int on many platforms,
but to unsigned int on some where sizeof(int) == 1. There are such
platforms, mostly Digital Signal Processors and some exotic RISC
architectures. You may not have encountered them, but I work on them
regularly.

So if the code is compiled on such a platform (such as the TI 2812 DSP
I am working on currently), the result is perfectly defined.


The lack of portability makes such a construct an undefined behaviour:

3.4.3

1 undefined behavior

behavior, upon use of a *nonportable* or erroneous program construct or
of erroneous data, for which this International Standard imposes no
requirements.


Nope, it's undefined behaviour *only* on implementations where the type
resulting from the integral promotions does not match the type expected
by the conversion specifier.

The correct statement is that the lack of portability prevents this
construct from being used in strictly conforming programs.

If you still don't get it, consider a simple example: 12345 * 3.
Undefined behaviour if INT_MAX == 32767, well defined behaviour otherwise.

And if you still don't get it: you cannot use the definition of undefined
behaviour to decide when a program invokes undefined behaviour. It is a
separate paragraph of the standard dealing with this issue:

2 If a ``shall'' or ``shall not'' requirement that appears outside
of a constraint is violated, the behavior is undefined. Undefined
behavior is otherwise indicated in this International Standard
by the words ``undefined behavior'' or by the omission of any
explicit definition of behavior. There is no difference in
emphasis among these three; they all describe ``behavior that
is undefined''.

Dan
--
Dan Pop
DESY Zeuthen, RZ group
Email: Da*****@ifh.de
Nov 14 '05 #10
Emmanuel Delahaye <em**********@noos.fr> wrote:
In 'comp.lang.c', j0******@engineer.com (j0mbolar) wrote:
#include <stdio.h>

int main(void)
{
long dword = 0xff;

printf("%u\n", ((unsigned char *)&dword)[0]);
return 0;
}

does the standard say this is legal?
if so or if not, what section?


No. An unsigned char will be converted to an int, but "%u" wants an unsigned
int. The behaviour is undefined.


If an unsigned char is converted to a signed int, it must be a
non-negative signed int. (otherwise it would have been converted
to unsigned int).

The standard says that non-negative signed ints must have the same
size, alignment and representation as unsigned ints. It can't be
a trap representation, or represent a different value. Therefore, as
far as a variadic function is concerned, it was passed a signed int.
Even the DS9000 could not go wrong here AFAICS, so shouldn't that
mean the behaviour is well-defined?
Nov 14 '05 #11
Dan Pop a écrit :
In <40*********************@news.club-internet.fr> Richard Delorme <ab****@nospam.fr> writes:

Jack Klein a écrit :

No. An unsigned char will be converted to an int, but "%u" wants an unsigned
int. The behaviour is undefined.
An unsigned char will be converted to signed int on many platforms,
but to unsigned int on some where sizeof(int) == 1. There are such
platforms, mostly Digital Signal Processors and some exotic RISC
architectures. You may not have encountered them, but I work on them
regularly.

So if the code is compiled on such a platform (such as the TI 2812 DSP
I am working on currently), the result is perfectly defined.
The lack of portability makes such a construct an undefined behaviour:

3.4.3

1 undefined behavior

behavior, upon use of a *nonportable* or erroneous program construct or
of erroneous data, for which this International Standard imposes no
requirements.

Nope, it's undefined behaviour *only* on implementations where the type
resulting from the integral promotions does not match the type expected
by the conversion specifier.


I don't think so. Undefined behaviour stands from the Standard's point
of view, not from the implementation's one. An implementation may define
a behaviour for what the standard leaves undefined.
The correct statement is that the lack of portability prevents this
construct from being used in strictly conforming programs.
Do you mean the word "nonportable" in the definition of "undefined
behaviour" is not correct?

If you still don't get it, consider a simple example: 12345 * 3.
Undefined behaviour if INT_MAX == 32767, well defined behaviour otherwise.
I know implementations where INT_MAX == 32767 and 12345 * 3 has a well
defined behaviour (the result is -28501); however, this behaviour has to
be found in the implementation documentation, not in the standard, that
do not specify the value of INT_MAX, neither define the behaviour of
12345 * 3 in case of overflow.
And if you still don't get it: you cannot use the definition of undefined
behaviour to decide when a program invokes undefined behaviour. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

I do not agree with this sentence. Undefined behaviour is a lack of
definition within the standard, not a property of a program. A program
may be erroneous in a way that seems too complicated for the Standard to
impose a particular behaviour for an implementation.
It is a
separate paragraph of the standard dealing with this issue:

2 If a ``shall'' or ``shall not'' requirement that appears outside
of a constraint is violated, the behavior is undefined. Undefined
behavior is otherwise indicated in this International Standard
by the words ``undefined behavior'' or by the omission of any
explicit definition of behavior. There is no difference in
emphasis among these three; they all describe ``behavior that
is undefined''.

If you still don't think that undefined behaviour is a portability
issue, guess what is the title of the the annex J, where the undefined
behaviours are recapitulated in J.2.

--
Richard
Nov 14 '05 #12
In <40*********************@news.club-internet.fr> Richard Delorme <ab****@nospam.fr> writes:
Dan Pop a écrit :
In <40*********************@news.club-internet.fr> Richard Delorme <ab****@nospam.fr> writes:

Jack Klein a écrit :
>No. An unsigned char will be converted to an int, but "%u" wants an unsigned
>int. The behaviour is undefined.
An unsigned char will be converted to signed int on many platforms,
but to unsigned int on some where sizeof(int) == 1. There are such
platforms, mostly Digital Signal Processors and some exotic RISC
architectures. You may not have encountered them, but I work on them
regularly.

So if the code is compiled on such a platform (such as the TI 2812 DSP
I am working on currently), the result is perfectly defined.

The lack of portability makes such a construct an undefined behaviour:

3.4.3

1 undefined behavior

behavior, upon use of a *nonportable* or erroneous program construct or
of erroneous data, for which this International Standard imposes no
requirements.

Nope, it's undefined behaviour *only* on implementations where the type
resulting from the integral promotions does not match the type expected
by the conversion specifier.


I don't think so. Undefined behaviour stands from the Standard's point
of view, not from the implementation's one. An implementation may define
a behaviour for what the standard leaves undefined.
The correct statement is that the lack of portability prevents this
construct from being used in strictly conforming programs.


Do you mean the word "nonportable" in the definition of "undefined
behaviour" is not correct?


It is perfectly correct, it is your interpretation of it that is
incorrect. It is NOT enough for a bit of code to be non-portable to
invoke undefined behaviour, it must satisfy other conditions, clearly
documented in the standard, in the text I have quoted. Why is that so
difficult to understand for you?

Example of non-portable code that does not invoke undefined behaviour:

#include <stdio.h>

int foo(void) { puts("I am foo"); return 1; }
int bar(void) { puts("I am bar"); return 1; }
int main() { return foo() - bar(); }

This is clearly non-portable code, with unpredictable output, as it relies
on unspecified behaviour. Do you claim that it invokes undefined
behaviour? Or that the definition of undefined behaviour is broken?
If you still don't get it, consider a simple example: 12345 * 3.
Undefined behaviour if INT_MAX == 32767, well defined behaviour otherwise.


I know implementations where INT_MAX == 32767 and 12345 * 3 has a well
defined behaviour (the result is -28501);


From the standard's point of view, this is undefined behaviour and, no
matter what the implementation defines/documents, nasal demons are still
allowed by the C standard.
however, this behaviour has to
be found in the implementation documentation, not in the standard, that
do not specify the value of INT_MAX, neither define the behaviour of
12345 * 3 in case of overflow.
And, because it doesn't define it, from its point of view *anything* can
happen after 12345 * 3 is evaluated, the definition provided by the
implementation doesn't change the program status, as far as the C standard
is concerned.
And if you still don't get it: you cannot use the definition of undefined
behaviour to decide when a program invokes undefined behaviour.

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

I do not agree with this sentence.


Then, you're a patent idiot. I have quoted you the exact chapter and
verse which specifies WHEN undefined behaviour is invoked. It is sheer
stupidity to invent other situations, based on the definition of undefined
behaviour.
Undefined behaviour is a lack of
definition within the standard, not a property of a program.
Undefined behaviour cannot exist in the absence of a program. Furthermore
in some cases, it is the implementation that decides whether the program
invokes undefined behaviour or not, as in the example with 12345 * 3
(if the implementation defines INT_MAX as 32767, the attempt to evaluate
this expression *unconditionally* invokes undefined behaviour, regardless
of what the documentation says).

Another example:

6 Any pointer type may be converted to an integer type. Except as
previously specified, the result is implementation-defined. If the
result cannot be represented in the integer type, the behavior
is undefined. The result need not be in the range of values of
any integer type.

According to your interpretation, this is undefined behaviour. Then, why
didn't the standard simply say:

6 Converting any pointer type to an integer type invokes undefined
behaviour.

??? What are all the other extra words for?
A program
may be erroneous in a way that seems too complicated for the Standard to
impose a particular behaviour for an implementation.


So what? If it matches any of the conditions listed in the text I have
quoted, it invokes undefined behavior. Otherwise, its behaviour is
unspecified, implementation-defined or well defined.
It is a
separate paragraph of the standard dealing with this issue:

2 If a ``shall'' or ``shall not'' requirement that appears outside
of a constraint is violated, the behavior is undefined. Undefined
behavior is otherwise indicated in this International Standard
by the words ``undefined behavior'' or by the omission of any
explicit definition of behavior. There is no difference in
emphasis among these three; they all describe ``behavior that
is undefined''.


If you still don't think that undefined behaviour is a portability
issue, guess what is the title of the the annex J, where the undefined
behaviours are recapitulated in J.2.


Your reasoning capabilities are severely damaged: undefined behaviour *is*
a portability issue, but this doesn't mean that *any* portability issue
is undefined behaviour. What about the *other* sections of appendix J?
Aren't they portability issues?

Dan
--
Dan Pop
DESY Zeuthen, RZ group
Email: Da*****@ifh.de
Nov 14 '05 #13
On 30 Jun 2004 14:27:41 -0700, ol*****@inspire.net.nz (Old Wolf)
wrote:
Emmanuel Delahaye <em**********@noos.fr> wrote:
In 'comp.lang.c', j0******@engineer.com (j0mbolar) wrote: [ (punned) uchar passed to printf %u ] No. An unsigned char will be converted to an int, but "%u" wants an unsigned
int. The behaviour is undefined.


If an unsigned char is converted to a signed int, it must be a
non-negative signed int. (otherwise it would have been converted
to unsigned int).

The standard says that non-negative signed ints must have the same
size, alignment and representation as unsigned ints. It can't be
a trap representation, or represent a different value. Therefore, as
far as a variadic function is concerned, it was passed a signed int.
Even the DS9000 could not go wrong here AFAICS, so shouldn't that
mean the behaviour is well-defined?


(Same representation only for values in the intersection of ranges,
but such a promoted value must be in the intersection. Same
representation is *nonnormatively*, in two footnotes, "meant to imply
interchangeability as arguments ....".)

For a user-written variadic function, (necessarily) using va_arg, this
is guaranteed explicitly in C99, as are xchar*/void* and the same
cases for unprototyped functions. There have been at least two rounds
of discussion on c.s.c whether the va_arg guarantees apply to standard
library functions, which aren't required to be implemented in C; there
appears to be a majority, but not necessarily a consensus, that this
was expected, but it's not clear it was actually specified.

And for *printf in particular there is the more local and thus
presumably overriding requirement in 7.19.6.1p9:
If any argument is not the correct type for the corresponding
conversion specification, the behavior is undefined.

In practice it would be exceedingly unlikely, and unhelpful, for any
implementor to break this. But that's not a formal requirement.

- David.Thompson1 at worldnet.att.net
Nov 14 '05 #14

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

19
by: MiniDisc_2k2 | last post by:
Okay, here's a question about the standard. What does it say about unsigned/signed mismatches in a comparison statement: char a = 3; unsigned char b = 255; if (a<b) Now what's the real...
3
by: Siemel Naran | last post by:
Hi. Is there a way to convert the type signed int to the type unsigned int, char to unsigned char, signed char to unsigned char, and so on for all the fundamental integer types? Something like ...
10
by: tinesan | last post by:
Hello fellow C programmers, I'm just learning to program with C, and I'm wondering what the difference between signed and unsigned char is. To me there seems to be no difference, and the...
4
by: ravinderthakur | last post by:
hi all experts, can anybody explain me the difference between the unsigned char and char in c/c++ langugage. specifically how does this affects the c library fucntion such as strcat,strtok...
3
by: QQ | last post by:
Hello, Here is my simple program int main() { unsigned char a =0x81; char b = 0x81; printf("unsigned char = 0x%x(%d), char = 0x%x(%d)\n",a,a,b,b); printf("cast char to unsigned...
5
by: Stephen Cawood | last post by:
I'm trying to use a C++ .lib from C# (I tried the Interop group will no results). I have a working wrapper DLL (I can get back simple things like int), but I'm having issues dealing with an array...
5
by: ryanlee101 | last post by:
I am getting a exception error when I complie my code. The error is: - imageData 0x00000000 <Bad Ptr> type unsigned char * I think it is from when I declare some of my char variables
26
by: =?gb2312?B?wNbA1rTzzOzKpg==?= | last post by:
i wrote: ----------------------------------------------------------------------- ---------------------------------------- unsigned char * p = reinterpret_cast<unsigned char *>("abcdg");...
8
by: Steven | last post by:
Hello, everyone! I find a version of strcpy(), I don't know why it return the unsigned char value. Can I change it into return *s1-*s2? int strcmp(const char *s1, const char *s2) { while...
29
by: Kenzogio | last post by:
Hi, I have a struct "allmsg" and him member : unsigned char card_number; //16 allmsg.card_number
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.