0x00000000 hexadecimal? - numbers

I had always been taught 0–9 to represent values zero to nine, and A, B, C, D, E, F for 10-15.
I see this format 0x00000000 and it doesn't fit into the pattern of hexadecimal. Is there a guide or a tutor somewhere that can explain it?
I googled for hexadecimal but I can't find any explanation of it.
So my 2nd question is, is there a name for the 0x00000000 format?

0x simply tells you the number after it will be in hex
so 0x00 is 0, 0x10 is 16, 0x11 is 17 etc

The 0x is just a prefix (used in C and many other programming languages) to mean that the following number is in base 16.
Other notations that have been used for hex include:
$ABCD
ABCDh
X'ABCD'
"ABCD"X

Yes, it is hexadecimal.
Otherwise, you can't represent A, for example. The compiler for C and Java will treat it as variable identifier. The added prefix 0x tells the compiler it's hexadecimal number, so:
int ten_i = 10;
int ten_h = 0xA;
ten_i == ten_h; // this boolean expression is true
The leading zeroes indicate the size: 0x0080 hints the number will be stored in two bytes; and 0x00000080 represents four bytes. Such notation is often used for flags: if a certain bit is set, that feature is enabled.
P.S. As an off-topic note: if the number starts with 0, then it's interpreted as octal number, for example 010 == 8. Here 0 is also a prefix.

Everything after the x are hex digits (the 0x is just a prefix to designate hex), representing 32 bits (if you were to put 0xFFFFFFFF in binary, it would be 1111 1111 1111 1111 1111 1111 1111 1111).

hexadecimal digits are often prefaced with 0x to indicate they are hexadecimal digits.
In this case, there are 8 digits, each representing 4 bits, so that is 32 bits or a word. I"m guessing you saw this in an error, and it is a memory address. this value means null, as the hex value is 0.

Related

In unicode standard, why does U+12ca = 0x12ca? Where does the 0 come from and how does 0x12ca = 4810 decimal

I'm learning about Unicode basics and I came across this passage:
"The Unicode standard describes how characters are represented by code points. A code point is an integer value, usually denoted in base 16. In the standard, a code point is written using the notation U+12ca to mean the character with value 0x12ca (4810 decimal)."
I have three questions from here.
what does the ca stand for? in some places i've seen it written as just U+12. what's the difference?
where did the 0 in 0x12ca come from? what does it mean?
how does the value 0x12ca become 4810 decimal?
its my first post here and would appreciate any help! have a nice day y'all!!
what does the ca stand for?
It stands for the hexadecimal digits c and a.
In some places I've seen it written as just U+12. What's the difference?
Either that is a mistake, or U+12 is another (IMO sloppy / ambiguous) way of writing U+0012 ... which is a different Unicode codepoint to U+12ca.
Where did the 0 in 0x12ca come from? what does it mean?
That is a different notation. That is hexadecimal (integer) literal notation as used in various programming languages; e.g. C, C++, Java and so on. It represents a number ... not necessarily a Unicode codepoint.
The 0x is just part of the notation. (It "comes from" the respective language specifications ...)
How does the value 0x12ca become 4810 decimal?
The 0x means that the remaining are hexadecimal digits (aka base 16), where:
a or A represents 10,
b or B represents 11,
c or C represents 12,
d or D represents 13,
e or E represents 14,
f or F represents 15,
So 0x12ca is 1 x 163 + 2 x 162 + 12 x 161 + 10 x 160 ... is 4810.
(Do the arithmetic yourself to check. Converting between base 10 and base 16 is simple high-school mathematics.)

Convert from int to binary or hex in mikroc

I got an int value from 0 to 255 and I want to convert that value to hex or binary so i can use it into an 8 bit register(PIC18F uC).
How can i do this conversion?
I tried to use IntToHex function from Conversion Library but the output of this function is a char value, and from here i got stuck.
I'm using mikroc for pic.
Where should I start?
Thanks!
This is a common problem. Many don't understand that, Decimal 15 is same as Hex F is same as Octal 17 is same as Binary 1111.
Different number systems are for Humans, for CPU, it's all Binary!
When OP says,
I got an int value from 0 to 255 and I want to convert that value to
hex or binary so i can use it into an 8 bit register(PIC18F uC).
It reflects this misunderstanding. Probably, because debugger is configured to show "decimal" values and sample code/datasheet shows Hex value for register operations.
So, when you get "int" value from 0 to 255, you can directly write that number to 8-bit register. You don't have to convert it to hex. Hex is just representation which makes Human's life easy.
What you can do is - this is good practise --
REG_VALUE = (unsigned char) int_value;

UTF-8 in decimal

Is representing UTF-8 encoding in decimals even possible? I think only values till 255 would be correct, am I right?
As far as I know, we can only represent UTF-8 in hex or binary form.
I think it is possible. Let's look at an example:
The Unicode code point for ∫ is U+222B.
Its UTF-8 encoding is E2 88 AB, in hexadecimal representation. In octal, this would be 342 210 253. In decimal, it would be 226 136 171. That is, if you represent each byte separately.
If you look at the same 3 bytes as a single number, you have E288AB in hexadecimal; 70504253 in octal; and 14846123 in decimal.

How to denote 160 bits SHA-1 string as 20 characters in ANSI?

For an input "hello", SHA-1 returns "aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d", which are 40 hex outputs. I know 1 byte can denote as 1 character, so the 160 bits output should be able to converted to 20 characters. But when I look up "aa" in an ASCII table, there are no such hex value, and I'm confused about that. How to map 160 bits SHA-1 string as 20 characters in ANSI?
ASCII only has 128 characters (7 bits), while ANSI has 256 (8 bits). As to the ANSI value of hex value AA (decimal 170), the corresponding ANSI character would be ª (see for example here).
Now, you have to keep in mind that a number of both ASCII and ANSI characters (0-31) are non-printable control characters (system bell, null character, etc.), so turning your hash into a readable 20 character string will be not possible in most cases. For instance, your example contains the hex value 0F, which would translate to a shift-in character.

Two's complement in ASN.1 Unaligned PER

I've recently had to work with ASN.1 Unaligned PER encoded data. I'm having a problem understanding how UPER does two's complement integer encoding in the SEQUENCE data type.
It seems to be flipping the most significant bit incorrectly (poor choice of words). For positive integers, the leading bit is 1 and for negative, it's 0. I assume that there's a method to the madness here but after a days work it seems I can't dig it out of the ITU-T standard nor can I figure it out on my own. I suspect it is because the INTEGER's are wrapped in the SEQUENCE type, but I don't understand why it would do this. I should point out that my understanding of ASN.1 is very limited.
A simple example, let's say I have the following schema
BEGIN
FooBar ::= SEQUENCE {
Foo INTEGER (-512..511),
Bar INTEGER (-512..511)
}
END
And I'm encoding the following, as Unaligned PER
test FooBar ::=
{
Foo 10,
Bar -10
}
Result of the encoding as hex and binary string and respectively expected values.
HEX: 0x829F60
BIN: 100000101001111101100000
EXPECTED HEX: 0x02BF60
EXPECTED BIN: 000000101011111101100000
Any ideas as to what's happening here?
"Foo" and "Bar" should be lowercase.
Your impression that the most significant bit is "flipped" derives from the particular choice of minimum and maximum permitted values of foo and bar in your definition of FooBar.
The permitted value range of foo, in your definition above, is -512..511. In PER, the encoding of foo occupies 10 bits. The least permitted value (-512) is encoded as 0 (in 10 bits). The next permitted value (-511) is encoded as 1 (in 10 bits). And so on.
If you define FooBar2 in the following way
FooBar2 ::= SEQUENCE {
foo2 INTEGER (1234..5678),
bar2 INTEGER (1234..5678)
}
foo2 will be encoded in 13 bits (just enough to hold a value between 0 and 4444=5678-1234), with the value 1234 being encoded as 0000000000000, the value 1235 being encoded as 0000000000001, and so on.
If you follow the rules in X.691, you will end up at 11.5.6 (from 13.2.2). This encodes these values, which are constrained whole numbers, as offsets from the lower bound, and therefore as positive values. So, 10 is encoded as 522 and -10 as 502 (decimal, respectively).
Edit: someone suggested a clarification on the calculations. Your lower bound is -512. Since 10 = -512 + 522, the offset encoded for 10 is 522. Similarly, since -10 = -512 + 502, the offset encoded for -10 is 502. These offsets are then encoded using 10 bits. Therefore, you end up with:
value offset encoded bits
----- ------ ------------
10 522 1000001010 (522 in binary)
-10 502 0111110110 (502 in binary)