{"id":1310,"date":"2013-10-01T18:37:41","date_gmt":"2013-10-01T18:37:41","guid":{"rendered":"https:\/\/clarionsharp.com\/blog\/?p=1310"},"modified":"2013-10-01T18:37:41","modified_gmt":"2013-10-01T18:37:41","slug":"working-with-64bit-signed-and-unsigned-integers","status":"publish","type":"post","link":"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/","title":{"rendered":"Working with 64bit Signed and Unsigned integers"},"content":{"rendered":"<p>Clarion 9.x will introduce RTL support to work with 64-bit signed and unsigned integers.\u00a0 The RTL has 19 functions (so far) which provide a means to assign values, add, subtract, multiply, divide, bit-shift, convert to\/from decimals, and more.<\/p>\n<p>How to define (applicable for FILE structures or variables):<br \/>\n! Declarations of INT64 and UINT64 types used in prototypes<br \/>\n!<br \/>\n! INT64\u00a0\u00a0\u00a0 GROUP,TYPE<br \/>\n! lo\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ULONG<br \/>\n! hi\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LONG<br \/>\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 END<br \/>\n!<br \/>\n! UINT64\u00a0\u00a0 GROUP,TYPE<br \/>\n! lo\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ULONG<br \/>\n! hi\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ULONG<br \/>\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 END<\/p>\n<p>List of functions:<br \/>\ni64Sign \u2013 return the sign<br \/>\ni64Negate &#8211; change the sign like the unary operator for numbers<br \/>\ni64ABS &#8211; equivalent to ABS()<br \/>\ni64Is0 &#8211; check for equality to 0<br \/>\nis32Bit &#8211; check the high half of number to be equal to 0<br \/>\ni64Assign &#8211; equivalent to the = assignment operator<br \/>\ni64To32 \u2013 take the lower 32 bits of the value<br \/>\ni64FromDecimal &#8211; direct DECIMAL to 64-bit integer conversion<br \/>\ni64ToDecimal &#8211; direct 64-bit integer to DECIMAL conversion<br \/>\ni64Shift &#8211; equivalent to BSHIFT (value, n)<br \/>\ni64LShift &#8211; equivalent to BSHIFT (value, n) if n is positive<br \/>\ni64RShift &#8211; equivalent to BSHIFT (value, -n) if n is positive<br \/>\ni64Add &#8211; equivalent to binary + operator<br \/>\ni64Sub &#8211; equivalent to binary &#8211; operator<br \/>\ni64Mult2 &#8211; equivalent to n*=2<br \/>\ni64Mult10 &#8211; equivalent to n=n*10+k<br \/>\ni64Mult &#8211; equivalent to * operator<br \/>\ni64Div10 &#8211; equivalent to x=n%10; n\/=10<br \/>\ni64Div &#8211; equivalent to \/ operator<\/p>\n<p>i64Div10 and i64Div for signed 64-bit integers assume that the define(compatible_modulus) pragma is set to &#8220;on&#8221;.<\/p>\n<p>The i64.INC is self-documenting<br \/>\nMODULE(&#8216;i64* family of RTL functions&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Returns sign of passed 64-bit signed integer<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;Reference to 64-bit signed integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if passed value is 0, -1 if paased value is negative, +1 if passed value is positive.&lt;\/returns&gt;<br \/>\ni64Sign\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 v),SIGNED,RAW,NAME(&#8216;Cla$i64Sign&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Negates value of passed signed 64-bit signed integer variable<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;Reference to 64-bit signed integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of overflow.&lt;\/returns&gt;<br \/>\ni64Negate\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 v),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Negate&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Negates value of passed signed 64 bit signed integer variable if it is<br \/>\n!!! negative<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;Reference to 64-bit signed integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of overflow.&lt;\/returns&gt;<br \/>\ni64ABS\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64ABS&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Compares value of passed 64-bit integer with 0<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;Reference to 64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;TRUE if passed value is 0.&lt;\/returns&gt;<br \/>\ni64Is0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 v),BOOL,RAW,NAME(&#8216;Cla$i64is0&#8217;)<br \/>\ni64Is0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 v),BOOL,RAW,NAME(&#8216;Cla$i64is0&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Checks that value of passed 64-bit integer can be stored to 32-bit<br \/>\n!!! integer without truncating<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;Reference to 64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;TRUE if passed value has significant bits in lower ULONG only.&lt;\/returns&gt;<br \/>\nis32Bit\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 v),BOOL,RAW,NAME(&#8216;Cla$is32Bit&#8217;)<br \/>\nis32Bit\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 v),BOOL,RAW,NAME(&#8216;Cla$is32BitU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Assign 32-bit value to passed 64-bit integer variable<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to change.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;Value to assign to destination variable.&lt;\/param&gt;<br \/>\ni64Assign\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 dest, LONG src),RAW,NAME(&#8216;Cla$i64AssignS&#8217;)<br \/>\ni64Assign\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 dest, ULONG src),RAW,NAME(&#8216;Cla$i64AssignU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Assign 64-bit value to passed 64-bit integer variable<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to change.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;Value to assign to destination variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of overflow or truncation.&lt;\/returns&gt;<br \/>\ni64Assign\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 dest,\u00a0 *INT64\u00a0 src),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64AssignSS&#8217;)<br \/>\ni64Assign\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 dest,\u00a0 *UINT64 src),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64AssignSU&#8217;)<br \/>\ni64Assign\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 dest, *INT64\u00a0 src),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64AssignUS&#8217;)<br \/>\ni64Assign\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 dest, *UINT64 src),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64AssignUU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Store 64-bit integer value to 32-bit integer variable<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;32-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of truncation&lt;\/returns&gt;<br \/>\ni64To32\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 src, *LONG dest),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64To32&#8217;)<br \/>\ni64To32\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 src, *ULONG dest),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64To32U&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Store DECIMAL value to 64-bit integer variable<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;DECIMAL value to assign to 64-bit integer variable.&lt;\/param&gt;<br \/>\ni64FromDecimal PROCEDURE (*INT64\u00a0 dest, *DECIMAL src),RAW,NAME(&#8216;Cla$i64FromDecS&#8217;)<br \/>\ni64FromDecimal PROCEDURE (*UINT64 dest, *DECIMAL src),RAW,NAME(&#8216;Cla$i64FromDecU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Store 64-bit integer value to DECIMAL variable.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;DECIMAL variable.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer value to store to DECIMAL variable.&lt;\/param&gt;<br \/>\ni64ToDecimal\u00a0\u00a0 PROCEDURE (*DECIMAL dest, *INT64\u00a0 src),RAW,NAME(&#8216;Cla$i64ToDecS&#8217;)<br \/>\ni64ToDecimal\u00a0\u00a0 PROCEDURE (*DECIMAL dest, *UINT64 src),RAW,NAME(&#8216;Cla$i64ToDecU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Shift value of 64-bit integer value to given number of bits to left or<br \/>\n!!! to right and store result to another 64-bit integer variable. Shift is<br \/>\n!!! to right if shift count value is negative, and is to left if shift count<br \/>\n!!! value is positive. The same variable can be passed both as a source value<br \/>\n!!! and as a destination variable.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer value to shift.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;cnt&#8221;&gt;Number of bits to shift.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;64-bit integer variable to store result to.&lt;\/param&gt;<br \/>\ni64Shift\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 src, SIGNED cnt, *INT64\u00a0 dest),RAW,NAME(&#8216;Cla$i64Shift&#8217;)<br \/>\ni64Shift\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 src, SIGNED cnt, *UINT64 dest),RAW,NAME(&#8216;Cla$i64ShiftU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Shift value of 64-bit variable to left to given number of bits and store<br \/>\n!!! result to another 64-bit integer variable. The same variable can be passed<br \/>\n!!! both as a source value and as a destination variable.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer value to shift.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;cnt&#8221;&gt;Number of bits to shift.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;64-bit integer variable to store result to.&lt;\/param&gt;<br \/>\ni64LShift\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 src, UNSIGNED cnt, *INT64\u00a0 dest),RAW,NAME(&#8216;Cla$i64LShift&#8217;)<br \/>\ni64LShift\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 src, UNSIGNED cnt, *UINT64 dest),RAW,NAME(&#8216;Cla$i64LShiftU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Shift value of 64-bit variable to right to given number of bits and store<br \/>\n!!! result to another 64-bit integer variable. The same variable can be passed<br \/>\n!!! both as a source value and as a destination variable.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer value to shift.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;cnt&#8221;&gt;Number of bits to shift.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;64-bit integer variable to store result to.&lt;\/param&gt;<br \/>\ni64RShift\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 src, UNSIGNED cnt, *INT64\u00a0 dest),RAW,NAME(&#8216;Cla$i64RShift&#8217;)<br \/>\ni64RShift\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 src, UNSIGNED cnt, *UINT64 dest),RAW,NAME(&#8216;Cla$i64RShiftU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Add value of one 64-bit integer variable to another one. Possible overflow<br \/>\n!!! is ignored.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;64-bit integer variable to increase by value of another variabke.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer value to add to value of destination variable.&lt;\/param&gt;<br \/>\ni64Add\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 dest,\u00a0 *INT64 src),RAW,NAME(&#8216;Cla$i64Add&#8217;)<br \/>\ni64Add\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 dest, *UINT64 src),RAW,NAME(&#8216;Cla$i64Add&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Subtract value of one 64-bit integer variable from another one. Possible<br \/>\n!!! overflow is ignored.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;64-bit integer variable to increase by value of another variabke.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer value to add to value of destination variable.&lt;\/param&gt;<br \/>\ni64Sub\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 dest,\u00a0 *INT64 src),RAW,NAME(&#8216;Cla$i64Sub&#8217;)<br \/>\ni64Sub\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 dest, *UINT64 src),RAW,NAME(&#8216;Cla$i64Sub&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Assign sum of two 64-bit integer values to passed 64-bit integer variable.<br \/>\n!!! The same variable can be passed as one of operands and as a destination.<br \/>\n!!! Possible overflow is ignored.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;op1&#8243;&gt;First 64-bit integer operand.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;op2&#8243;&gt;Second 64-bit integer operand.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to store the result.&lt;\/param&gt;<br \/>\ni64Add\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 op1, *INT64\u00a0 op2, *INT64\u00a0 dest),RAW,NAME(&#8216;Cla$i64Add3&#8217;)<br \/>\ni64Add\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 op1, *UINT64 op2, *UINT64 dest),RAW,NAME(&#8216;Cla$i64Add3U&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Assign result of subtraction of two 64-bit integer values to passed 64-bit<br \/>\n!!! integer variable. The same variable can be passed as one of operands and<br \/>\n!!! as a destination. Possible overflow is ignored.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;op1&#8243;&gt;First 64-bit integer operand of subtraction.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;op2&#8243;&gt;Second 64-bit integer operand of subtraction.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to store the result.&lt;\/param&gt;<br \/>\ni64Sub\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 op1, *INT64\u00a0 op2, *INT64\u00a0 dest),RAW,NAME(&#8216;Cla$i64Sub3&#8217;)<br \/>\ni64Sub\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 op1, *UINT64 op2, *UINT64 dest),RAW,NAME(&#8216;Cla$i64Sub3U&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Multiply value of 64-bit integer variable by 2<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of overflow.&lt;\/returns&gt;<br \/>\ni64Mult2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 v),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Mult2&#8217;)<br \/>\ni64Mult2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 v),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Mult2U&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Multiply value of 64-bit integer variable by 10, add passed 32-bit value<br \/>\n!!! and store result back to variable<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;inc&#8221;&gt;32-bit integer increment value.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of overflow.&lt;\/returns&gt;<br \/>\ni64Mult10\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 v, LONG\u00a0 inc = 0),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Mult10&#8217;)<br \/>\ni64Mult10\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 v, ULONG inc = 0),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Mult10U&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Multiply two 64-bit integer values and store result to passed 64-bit<br \/>\n!!! integer variable. The same variable can be passed as one of parameters<br \/>\n!!! and as a destination. Possible overflow is ignored.<br \/>\n!!! &lt;param name=&#8221;op1&#8243;&gt;64-bit integer multiplier.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;op2&#8243;&gt;64-bit integer multiplicand.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to store result.&lt;\/param&gt;<br \/>\ni64Mult\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 op1, *INT64\u00a0 op2, *INT64\u00a0 dest),RAW,NAME(&#8216;Cla$i64Mult&#8217;)<br \/>\ni64Mult\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 op1, *UINT64 op2, *UINT64 dest),RAW,NAME(&#8216;Cla$i64MultU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Divide value of 64-bit integer variable to 10 and store quotient back to<br \/>\n!!! variable. The remainder is stored to 32-bit integer variable. Value of<br \/>\n!!! remainder is positive always.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;rem&#8221;&gt;32-bit integer variable to store remainder.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of errors.&lt;\/returns&gt;<br \/>\ni64Div10\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 v, *LONG rem),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Div10&#8217;)<br \/>\ni64Div10\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 v, *LONG rem),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Div10U&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Store result of division of two 64-bit signed integer values to passed<br \/>\n!!! 64-bit variable. The same variable can be passed as one of operands and<br \/>\n!!! as a destination variable.<br \/>\n!!!<br \/>\n!!! Result corresponds to value of define(compatible_modulus) pragma set to &#8220;on&#8221;<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;op1&#8243;&gt;64-bit integer dividend.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;op2&#8243;&gt;64-bit integer divisor.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to store quotient.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of errors.&lt;\/returns&gt;<br \/>\ni64Div\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 op1, *INT64 op2, *INT64 dest),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Div&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Store result of division of two 64-bit unsigned integer values to passed<br \/>\n!!! 64-bit variable. The same variable can be passed as one of operands and<br \/>\n!!! as a destination variable.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;op1&#8243;&gt;64-bit integer dividend.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;op2&#8243;&gt;64-bit integer divisor.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to store quotient.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of errors.&lt;\/returns&gt;<br \/>\ni64Div\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 op1, *UINT64 op2, *UINT64 dest),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64DivU&#8217;)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Clarion 9.x will introduce RTL support to work with 64-bit signed and unsigned integers.\u00a0 The RTL has 19 functions (so far) which provide a means to assign values, add, subtract, multiply, divide, bit-shift, convert to\/from decimals, and more. How to define (applicable for FILE structures or variables): ! Declarations of INT64 and UINT64 types used &hellip; <a href=\"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Working with 64bit Signed and Unsigned integers<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1310","post","type-post","status-publish","format-standard","hentry","category-clarionnews"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Working with 64bit Signed and Unsigned integers - Clarion<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Working with 64bit Signed and Unsigned integers - Clarion\" \/>\n<meta property=\"og:description\" content=\"Clarion 9.x will introduce RTL support to work with 64-bit signed and unsigned integers.\u00a0 The RTL has 19 functions (so far) which provide a means to assign values, add, subtract, multiply, divide, bit-shift, convert to\/from decimals, and more. How to define (applicable for FILE structures or variables): ! Declarations of INT64 and UINT64 types used &hellip; Continue reading Working with 64bit Signed and Unsigned integers &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/\" \/>\n<meta property=\"og:site_name\" content=\"Clarion\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/softvelocity\/\" \/>\n<meta property=\"article:published_time\" content=\"2013-10-01T18:37:41+00:00\" \/>\n<meta name=\"author\" content=\"rzaunere\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"rzaunere\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/working-with-64bit-signed-and-unsigned-integers\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/working-with-64bit-signed-and-unsigned-integers\\\/\"},\"author\":{\"name\":\"rzaunere\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#\\\/schema\\\/person\\\/b90e860529aea05ad064cf2687697ce3\"},\"headline\":\"Working with 64bit Signed and Unsigned integers\",\"datePublished\":\"2013-10-01T18:37:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/working-with-64bit-signed-and-unsigned-integers\\\/\"},\"wordCount\":2256,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#organization\"},\"articleSection\":[\"Clarion News\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/working-with-64bit-signed-and-unsigned-integers\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/working-with-64bit-signed-and-unsigned-integers\\\/\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/working-with-64bit-signed-and-unsigned-integers\\\/\",\"name\":\"Working with 64bit Signed and Unsigned integers - Clarion\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#website\"},\"datePublished\":\"2013-10-01T18:37:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/working-with-64bit-signed-and-unsigned-integers\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/working-with-64bit-signed-and-unsigned-integers\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/working-with-64bit-signed-and-unsigned-integers\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Working with 64bit Signed and Unsigned integers\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/\",\"name\":\"Clarion\",\"description\":\"Deliver your software on time, every time\",\"publisher\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#organization\",\"name\":\"SoftVelocity\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/03\\\/svlogonew57.png\",\"contentUrl\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/03\\\/svlogonew57.png\",\"width\":221,\"height\":57,\"caption\":\"SoftVelocity\"},\"image\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/softvelocity\\\/\",\"https:\\\/\\\/www.youtube.com\\\/user\\\/SoftVelocity\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#\\\/schema\\\/person\\\/b90e860529aea05ad064cf2687697ce3\",\"name\":\"rzaunere\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g\",\"caption\":\"rzaunere\"},\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/author\\\/rzaunere\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Working with 64bit Signed and Unsigned integers - Clarion","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/","og_locale":"en_US","og_type":"article","og_title":"Working with 64bit Signed and Unsigned integers - Clarion","og_description":"Clarion 9.x will introduce RTL support to work with 64-bit signed and unsigned integers.\u00a0 The RTL has 19 functions (so far) which provide a means to assign values, add, subtract, multiply, divide, bit-shift, convert to\/from decimals, and more. How to define (applicable for FILE structures or variables): ! Declarations of INT64 and UINT64 types used &hellip; Continue reading Working with 64bit Signed and Unsigned integers &rarr;","og_url":"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/","og_site_name":"Clarion","article_publisher":"https:\/\/www.facebook.com\/softvelocity\/","article_published_time":"2013-10-01T18:37:41+00:00","author":"rzaunere","twitter_card":"summary_large_image","twitter_misc":{"Written by":"rzaunere","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/#article","isPartOf":{"@id":"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/"},"author":{"name":"rzaunere","@id":"https:\/\/clarionsharp.com\/blog\/#\/schema\/person\/b90e860529aea05ad064cf2687697ce3"},"headline":"Working with 64bit Signed and Unsigned integers","datePublished":"2013-10-01T18:37:41+00:00","mainEntityOfPage":{"@id":"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/"},"wordCount":2256,"commentCount":0,"publisher":{"@id":"https:\/\/clarionsharp.com\/blog\/#organization"},"articleSection":["Clarion News"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/","url":"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/","name":"Working with 64bit Signed and Unsigned integers - Clarion","isPartOf":{"@id":"https:\/\/clarionsharp.com\/blog\/#website"},"datePublished":"2013-10-01T18:37:41+00:00","breadcrumb":{"@id":"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/clarionsharp.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Working with 64bit Signed and Unsigned integers"}]},{"@type":"WebSite","@id":"https:\/\/clarionsharp.com\/blog\/#website","url":"https:\/\/clarionsharp.com\/blog\/","name":"Clarion","description":"Deliver your software on time, every time","publisher":{"@id":"https:\/\/clarionsharp.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/clarionsharp.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/clarionsharp.com\/blog\/#organization","name":"SoftVelocity","url":"https:\/\/clarionsharp.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/clarionsharp.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2019\/03\/svlogonew57.png","contentUrl":"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2019\/03\/svlogonew57.png","width":221,"height":57,"caption":"SoftVelocity"},"image":{"@id":"https:\/\/clarionsharp.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/softvelocity\/","https:\/\/www.youtube.com\/user\/SoftVelocity"]},{"@type":"Person","@id":"https:\/\/clarionsharp.com\/blog\/#\/schema\/person\/b90e860529aea05ad064cf2687697ce3","name":"rzaunere","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g","caption":"rzaunere"},"url":"https:\/\/clarionsharp.com\/blog\/author\/rzaunere\/"}]}},"_links":{"self":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/1310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/comments?post=1310"}],"version-history":[{"count":9,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/1310\/revisions"}],"predecessor-version":[{"id":1319,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/1310\/revisions\/1319"}],"wp:attachment":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/media?parent=1310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/categories?post=1310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/tags?post=1310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}