source: public/doc/gnu-c/Integer-Arithmetic.html@ 02598c2

Last change on this file since 02598c2 was 02598c2, checked in by Mikhail Kirillov <w96k@…>, on Oct 6, 2022 at 12:36:29 PM

Add gnu-c

  • Property mode set to 100644
File size: 6.2 KB
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<!-- Copyright (C) 2022 Richard Stallman and Free Software Foundation, Inc.
4
5(The work of Trevis Rothwell and Nelson Beebe has been assigned or
6licensed to the FSF.)
7
8Permission is granted to copy, distribute and/or modify this document
9under the terms of the GNU Free Documentation License, Version 1.3 or
10any later version published by the Free Software Foundation; with the
11Invariant Sections being "GNU General Public License," with the
12Front-Cover Texts being "A GNU Manual," and with the Back-Cover
13Texts as in (a) below. A copy of the license is included in the
14section entitled "GNU Free Documentation License."
15
16(a) The FSF's Back-Cover Text is: "You have the freedom to copy and
17modify this GNU manual. Buying copies from the FSF supports it in
18developing GNU and promoting software freedom." -->
19<!-- Created by GNU Texinfo 6.7, http://www.gnu.org/software/texinfo/ -->
20<head>
21<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
22<title>Integer Arithmetic (GNU C Language Manual)</title>
23
24<meta name="description" content="Integer Arithmetic (GNU C Language Manual)">
25<meta name="keywords" content="Integer Arithmetic (GNU C Language Manual)">
26<meta name="resource-type" content="document">
27<meta name="distribution" content="global">
28<meta name="Generator" content="makeinfo">
29<link href="index.html" rel="start" title="Top">
30<link href="Symbol-Index.html" rel="index" title="Symbol Index">
31<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
32<link href="Arithmetic.html" rel="up" title="Arithmetic">
33<link href="Integer-Overflow.html" rel="next" title="Integer Overflow">
34<link href="Basic-Arithmetic.html" rel="prev" title="Basic Arithmetic">
35<style type="text/css">
36<!--
37a.summary-letter {text-decoration: none}
38blockquote.indentedblock {margin-right: 0em}
39div.display {margin-left: 3.2em}
40div.example {margin-left: 3.2em}
41div.lisp {margin-left: 3.2em}
42kbd {font-style: oblique}
43pre.display {font-family: inherit}
44pre.format {font-family: inherit}
45pre.menu-comment {font-family: serif}
46pre.menu-preformatted {font-family: serif}
47span.nolinebreak {white-space: nowrap}
48span.roman {font-family: initial; font-weight: normal}
49span.sansserif {font-family: sans-serif; font-weight: normal}
50ul.no-bullet {list-style: none}
51-->
52</style>
53
54
55</head>
56
57<body lang="en">
58<span id="Integer-Arithmetic"></span><div class="header">
59<p>
60Next: <a href="Integer-Overflow.html" accesskey="n" rel="next">Integer Overflow</a>, Previous: <a href="Basic-Arithmetic.html" accesskey="p" rel="prev">Basic Arithmetic</a>, Up: <a href="Arithmetic.html" accesskey="u" rel="up">Arithmetic</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Symbol-Index.html" title="Index" rel="index">Index</a>]</p>
61</div>
62<hr>
63<span id="Integer-Arithmetic-1"></span><h3 class="section">6.2 Integer Arithmetic</h3>
64<span id="index-integer-arithmetic"></span>
65
66<p>Each of the basic arithmetic operations in C has two variants for
67integers: <em>signed</em> and <em>unsigned</em>. The choice is determined
68by the data types of their operands.
69</p>
70<p>Each integer data type in C is either <em>signed</em> or <em>unsigned</em>.
71A signed type can hold a range of positive and negative numbers, with
72zero near the middle of the range. An unsigned type can hold only
73nonnegative numbers; its range starts with zero and runs upward.
74</p>
75<p>The most basic integer types are <code>int</code>, which normally can hold
76numbers from -2,147,483,648 to 2,147,483,647, and <code>unsigned
77int</code>, which normally can hold numbers from 0 to 4,294.967,295. (This
78assumes <code>int</code> is 32 bits wide, always true for GNU C on real
79computers but not always on embedded controllers.) See <a href="Integer-Types.html">Integer Types</a>, for full information about integer types.
80</p>
81<p>When a basic arithmetic operation is given two signed operands, it
82does signed arithmetic. Given two unsigned operands, it does
83unsigned arithmetic.
84</p>
85<p>If one operand is <code>unsigned int</code> and the other is <code>int</code>, the
86operator treats them both as unsigned. More generally, the common
87type of the operands determines whether the operation is signed or
88not. See <a href="Common-Type.html">Common Type</a>.
89</p>
90<p>Printing the results of unsigned arithmetic with <code>printf</code> using
91&lsquo;<samp>%d</samp>&rsquo; can produce surprising results for values far away from
92zero. Even though the rules above say that the computation was done
93with unsigned arithmetic, the printed result may appear to be signed!
94</p>
95<p>The explanation is that the bit pattern resulting from addition,
96subtraction or multiplication is actually the same for signed and
97unsigned operations. The difference is only in the data type of the
98result, which affects the <em>interpretation</em> of the result bit pattern,
99and whether the arithmetic operation can overflow (see the next section).
100</p>
101<p>But &lsquo;<samp>%d</samp>&rsquo; doesn&rsquo;t know its argument&rsquo;s data type. It sees only the
102value&rsquo;s bit pattern, and it is defined to interpret that as
103<code>signed int</code>. To print it as unsigned requires using &lsquo;<samp>%u</samp>&rsquo;
104instead of &lsquo;<samp>%d</samp>&rsquo;. See <a href="https://www.gnu.org/software/libc/manual/html_node/Formatted-Output.html#Formatted-Output">The GNU C Library</a> in <cite>The GNU C Library Reference Manual</cite>.
105</p>
106<p>Arithmetic in C never operates directly on narrow integer types (those
107with fewer bits than <code>int</code>; <a href="Narrow-Integers.html">Narrow Integers</a>). Instead it
108&ldquo;promotes&rdquo; them to <code>int</code>. See <a href="Operand-Promotions.html">Operand Promotions</a>.
109</p>
110<hr>
111<div class="header">
112<p>
113Next: <a href="Integer-Overflow.html" accesskey="n" rel="next">Integer Overflow</a>, Previous: <a href="Basic-Arithmetic.html" accesskey="p" rel="prev">Basic Arithmetic</a>, Up: <a href="Arithmetic.html" accesskey="u" rel="up">Arithmetic</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Symbol-Index.html" title="Index" rel="index">Index</a>]</p>
114</div>
115
116
117
118</body>
119</html>
Note: See TracBrowser for help on using the repository browser.