#include <string.h>
int i; /* 4-byte == 4-char */
char data[] = { 0x78, 0x56, 0x34, 0x12 };
int main()
{
memcpy(&i, data, 4);
/*
* Thinking about endianness, what can be said about
* the value of i according to the C-spec?
*/
}
/* Thanks for listening! Case */ 26 11677
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Case wrote: #include <string.h>
int i; /* 4-byte == 4-char */ char data[] = { 0x78, 0x56, 0x34, 0x12 };
int main() { memcpy(&i, data, 4);
First off, sizeof(i) may not be equal to 4. So, this may or may not do what you
expect it to do.
/* * Thinking about endianness, what can be said about * the value of i according to the C-spec? */
Nothing can be said about the value of i.
1) you may or may not have set the value of i to a known quantity. If sizeof(i)
is greater than 4, then you didn't set i's storage completely, and if sizeof(i)
is less than 4, then some of your initialization was not used to set i (and
overwrote something else instead)
2) the standard doesn't specify how an integer is to map into a character array.
It doesn't specify a particular endianness for integers.
}
/* Thanks for listening! Case */
- --
Lew Pitcher
IT Consultant, Enterprise Application Architecture,
Enterprise Technology Solutions, TD Bank Financial Group
(Opinions expressed are my own, not my employers')
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (MingW32)
iD8DBQFAn5YjagV FX4UWr64RAgNYAK CGonjwOnfElYsZr CbrxpSzMS+rdgCg 0oeE
3mzpLbH2n9S6Pv2 gfAIfvTs=
=hmVd
-----END PGP SIGNATURE-----
Case <no@no.no> writes: #include <string.h>
int i; /* 4-byte == 4-char */ char data[] = { 0x78, 0x56, 0x34, 0x12 };
int main() { memcpy(&i, data, 4);
/* * Thinking about endianness, what can be said about * the value of i according to the C-spec? */ }
/* Thanks for listening! Case */
A signed integer has a sign bit, a number of value bits (each of which
has a value that is an integral power of two), and possibly padding
bits. The standard does not impose any rule how the bits have to be
arranged.
For example, in the special case of `int' having 31 value bits and no
padding bits, there are 263130836933693 530167218012160 000000 (== 32!)
possibilities how to arrange the bits. Three are particularly popular
among implementors, so that they have special names: little, big, and
mixed endian. The remaining 263130836933693 530167218012159 999997 don't
have any endianess.
Therefore, not much can be said about the value of `i' from the
perspective of the C standard.
Martin
--
,--. Martin Dickopp, Dresden, Germany ,= ,-_-. =.
/ ,- ) http://www.zero-based.org/ ((_/)o o(\_))
\ `-' `-'(. .)`-'
`-. Debian, a variant of the GNU operating system. \_/
Lew Pitcher wrote: -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Case wrote:
#include <string.h>
int i; /* 4-byte == 4-char */ char data[] = { 0x78, 0x56, 0x34, 0x12 };
int main() { memcpy(&i, data, 4);
First off, sizeof(i) may not be equal to 4. So, this may or may not do what you expect it to do.
Yes, I know. That's why I said i is '4-byte == 4-char'. /* * Thinking about endianness, what can be said about * the value of i according to the C-spec? */ Nothing can be said about the value of i. 1) you may or may not have set the value of i to a known quantity. If sizeof(i) is greater than 4, then you didn't set i's storage completely, and if sizeof(i) is less than 4, then some of your initialization was not used to set i (and overwrote something else instead)
It's 4 as I said (see above). And, doesn't the C standard say that
'global' data (as i is) is initialized to 0?!
2) the standard doesn't specify how an integer is to map into a character array. It doesn't specify a particular endianness for integers.
Martin Dickopp wrote: Case <no@no.no> writes:
#include <string.h>
int i; /* 4-byte == 4-char */ char data[] = { 0x78, 0x56, 0x34, 0x12 };
int main() { memcpy(&i, data, 4);
/* * Thinking about endianness, what can be said about * the value of i according to the C-spec? */ }
/* Thanks for listening! Case */
A signed integer has a sign bit, a number of value bits (each of which has a value that is an integral power of two), and possibly padding bits. The standard does not impose any rule how the bits have to be arranged.
For example, in the special case of `int' having 31 value bits and no padding bits, there are 263130836933693 530167218012160 000000 (== 32!) possibilities how to arrange the bits. Three are particularly popular among implementors, so that they have special names: little, big, and mixed endian. The remaining 263130836933693 530167218012159 999997 don't have any endianess.
Therefore, not much can be said about the value of `i' from the perspective of the C standard.
How many different values can i have given code above? With value I
mean a number at C level, not implementation level.
Lew Pitcher wrote: Case wrote:
#include <string.h>
int i; /* 4-byte == 4-char */ char data[] = { 0x78, 0x56, 0x34, 0x12 };
int main() { memcpy(&i, data, 4);
First off, sizeof(i) may not be equal to 4. So, this may or may not do what you expect it to do. /* * Thinking about endianness, what can be said about * the value of i according to the C-spec? */
Nothing can be said about the value of i. 1) you may or may not have set the value of i to a known quantity. If sizeof(i) is greater than 4, then you didn't set i's storage completely, and if sizeof(i) is less than 4, then some of your initialization was not used to set i (and overwrote something else instead) 2) the standard doesn't specify how an integer is to map into a character array. It doesn't specify a particular endianness for integers.
In terms of implementation, what mappings mapping are common?
Case wrote: Lew Pitcher wrote: Case wrote:
#include <string.h>
int i; /* 4-byte == 4-char */ char data[] = { 0x78, 0x56, 0x34, 0x12 };
int main() { memcpy(&i, data, 4);
First off, sizeof(i) may not be equal to 4. So, this may or may not do what you expect it to do.
Yes, I know. That's why I said i is '4-byte == 4-char'.
.... snip ... Nothing can be said about the value of i. 1) you may or may not have set the value of i to a known quantity. If sizeof(i) is greater than 4, then you didn't set i's storage completely, and if sizeof(i) is less than 4, then some of your initialization was not used to set i (and overwrote something else instead)
It's 4 as I said (see above). And, doesn't the C standard say that 'global' data (as i is) is initialized to 0?!
The fact that 'you said' doesn't make it so. The initialization
doesn't matter, because you have no idea what bits or bytes belong
where. This newsgroup deals only with portable standard C, so
your particular platform is of no interest whatsoever.
--
"I'm a war president. I make decisions here in the Oval Office
in foreign policy matters with war on my mind." - Bush.
"Churchill and Bush can both be considered wartime leaders, just
as Secretariat and Mr Ed were both horses." - James Rhodes.
Case wrote: [code setting the bytes of a four-byte `int' to:] char data[] = { 0x78, 0x56, 0x34, 0x12 };
In terms of implementation, what mappings mapping are common?
"Big-Endian:" the value is 0x78563412
"Little-Endian:" the value is 0x12345678
"Middle-Endian:" the value is 0x56781234
Other formats are possible, of course, and permitted by the
C Standard. Also, the latest C99 Standard permits an `int' to
have "trap representations " somewhat like an IEEE signalling NaN:
some arrangements of bits may signify "erroneous data" rather than
encoding a numeric value. It's at least possible thet storing
these four bytes in an integer could produce such a result.
For what it's worth, I've never encountered a machine that
used trap representations in integers or that used an "endian"
arrangement other than the three listed above. YMMV.
--
Er*********@sun .com
Case <no@no.no> writes: Martin Dickopp wrote: Case <no@no.no> writes:
#include <string.h>
int i; /* 4-byte == 4-char */ char data[] = { 0x78, 0x56, 0x34, 0x12 };
int main() { memcpy(&i, data, 4);
/* * Thinking about endianness, what can be said about * the value of i according to the C-spec? */ }
/* Thanks for listening! Case */ A signed integer has a sign bit, a number of value bits (each of which has a value that is an integral power of two), and possibly padding bits. The standard does not impose any rule how the bits have to be arranged. For example, in the special case of `int' having 31 value bits and no padding bits, there are 263130836933693 530167218012160 000000 (== 32!) possibilities how to arrange the bits. Three are particularly popular among implementors, so that they have special names: little, big, and mixed endian. The remaining 263130836933693 530167218012159 999997 don't have any endianess. Therefore, not much can be said about the value of `i' from the perspective of the C standard.
How many different values can i have given code above?
If type `int' has 31 value bits and no padding bits, and bytes have 8
bits, then `i' will have 13 one-bits and 19 zero-bits. The number of
values with this property is given by the binomial coefficient
"32 choose 13", which is 347373600. That's how many different values
`i' can have.
With value I mean a number at C level, not implementation level.
I don't know what you mean by "C level" or "implementa tion level".
Martin
--
,--. Martin Dickopp, Dresden, Germany ,= ,-_-. =.
/ ,- ) http://www.zero-based.org/ ((_/)o o(\_))
\ `-' `-'(. .)`-'
`-. Debian, a variant of the GNU operating system. \_/
In article <40************ *********@news. xs4all.nl>, Case <no@no.no>
wrote: #include <string.h>
int i; /* 4-byte == 4-char */ char data[] = { 0x78, 0x56, 0x34, 0x12 };
int main() { memcpy(&i, data, 4);
/* * Thinking about endianness, what can be said about * the value of i according to the C-spec? */ }
Nothing. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: kelvSYC |
last post by:
Are there any endianness concerns in C++, or does the compiler take
care of those details? I ask because I'm not sure if code such as the
following have consistent behavior on all platforms.
typedef unsigned int u32; // sizeof(int) == 4
typedef unsigned char u8;
u8 array = { 0x01, 0x23, 0x45, 0x67 };
*((u32*) array) = 0x89ABCDEF;
|
by: T Koster |
last post by:
Hi group,
I'm having some difficulty figuring out the most portable way to read 24
bits from a file. This is related to a Base-64 encoding.
The file is opened in binary mode, and I'm using fread to read three
bytes from it. The question is though, where should fread put this? I
have considered two alternatives, but neither seem like a good idea:
In most cases, the width of a char is 8 bits, so an array of 3 chars
|
by: SSM |
last post by:
Hi,
Does C standard comment about "Endianness" to be used
to store a structure/union variables?
Thanks & Regards,
Mehta
|
by: gamehack |
last post by:
Hi all,
I was thinking today, suppose we have the number
n = 0xAB 0xFF
which is equivalent to 44031 in decimal. In big endian it will be
stored as
10101011 11111111
but in little endian it will be
11111111 10101011
If we then apply a bit shift n << 2; that would give us completely
|
by: friend.05 |
last post by:
Code to check endianness of machine
| |
by: Indian.croesus |
last post by:
Hi,
If I am right Endianness is CPU related. I do not know if the
question is right in itself but if it is then how does C handle issues
arising out of Endianness.
I understand that if we pass structures using sockets across platforms,
we need to take care of Endianness issues at the application level. But
for example, for the code using bitwise AND to figure out if a number
is odd or even, how does C know the LSB position?
|
by: Martin |
last post by:
For reasons I won't go into, I need to transfer from 1 to 3 bytes to a
variable that I know is 4 bytes long. Bytes not written to in the 4-byte
target variable must be zero. Is the following use of memcpy() a
well-defined way of so doing? The code is written knowing that
sizeof(unsigned long) == 4 in this instance. The code is somewhat contrived
in order to provide a self-contained program that will compile and show the
use of memcpy() I...
|
by: Rahul |
last post by:
Hi Everyone,
I have a program unit which does >and << of an integer which is of
4 bytes length. The logic of shifting and action based on the result,
assumes that the system is big-endian.
Accordingly, if i need the program to work fine in a little-endian
system. I understand that the code needs to be changed. ( I couldn't
find any statement in C90 about endianness, hence i'm assuming that c
programs are not portable if the endianness...
|
by: =?Utf-8?B?RGF0ZWxNb25rZXk5OQ==?= |
last post by:
I have some c++ code that I am converting to C#. What I need to convert is
the following:
memcpy(&tmpshort, (pTmpDataIn+1), 2);
This should copy two bytes of an char* to an int which then gets used
elsewhere. I am having trouble coming up with how to approach.
Thanks,
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
| |
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own....
Now, this would greatly impact the work of software developers. The idea...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 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 a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |