Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. Other Discussions
  3. The Weird and The Wonderful
  4. [Solved] Why Do Computer Counts from Zero.

[Solved] Why Do Computer Counts from Zero.

Scheduled Pinned Locked Moved The Weird and The Wonderful
comdata-structuresperformance
26 Posts 13 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Keith Barrow

    I thought it was to save electrons.:~

    “Education is not the piling on of learning, information, data, facts, skills, or abilities - that's training or instruction - but is rather making visible what is hidden as a seed”
    “One of the greatest problems of our time is that many are schooled but few are educated”

    Sir Thomas More (1478 – 1535)

    K Offline
    K Offline
    kburman6
    wrote on last edited by
    #13

    I thought that it was to save Dark enrgy used in between the two calculation steps. :laugh: Just Joking. :-\

    1 Reply Last reply
    0
    • K kburman6

      Link to the article For More detail explanation(PDF) Counting arrays from 0 simplifies the computation of the memory address of each element. If an array is stored at a given position in memory (it’s called the address) the position of each element can be computed as

      element(n) = address + n * size_of_the_element
      //If you consider the first element the first, the computation becomes

      element(n) = address + (n-1) * size_of_the_element
      //Not a huge difference but it adds an unnecessary subtraction for each access.

      J Offline
      J Offline
      jsc42
      wrote on last edited by
      #14

      Actually, it doesn't simplify the calculation of the address. It just aids the ability to interchangeably address the whole array and the address of its first element (e.g. in C, &array and &array[0] both give the same address). In languages like FORTRAN (from 1957 to current day) which start indices from 1, the formula is

      element(n) = (address_of_array - size_of_the_element) + n * size_of_the_element

      which is just as simple as starting from 0 as (address_of_array - size_of_the_element) is a compile time constant value. Considering the millions of errors over the decades that starting from zero has perpetuated (e.g. forgetting to add one to the bounds when declaring the array or getting the end point wrong in loops or wasting space by deliberately skipping element 0), doing the compile time calculation would have been a small price to pay.

      S 1 Reply Last reply
      0
      • OriginalGriffO OriginalGriff

        Oh yes. Little tiny wasted instructions add up fast when you do them as often as array accesses. And remember, when this was decided, even HUGE computers ran at much, much, lower speeds - an IBM 360/195 could execute 16,000,000 instructions per second (at best), compared to the around 6,000,000,000 that your PC is (probably) capable of executing - it's difficult to be sure, due to multiple cores, pipelines, and caches, all of which were a lot smaller or nonexistent in those days. And remember, a 360/195 cost about £3,000,000 back in 1982, when beer was £0.30 per pint...so you didn't want to waste anything! :laugh:

        The universe is composed of electrons, neutrons, protons and......morons. (ThePhantomUpvoter)

        E Offline
        E Offline
        Erik Rude
        wrote on last edited by
        #15

        Imagine you'd bought the beer instead :) - You wouldn't be able to count to zero let alone from zero

        1 Reply Last reply
        0
        • J jsc42

          Actually, it doesn't simplify the calculation of the address. It just aids the ability to interchangeably address the whole array and the address of its first element (e.g. in C, &array and &array[0] both give the same address). In languages like FORTRAN (from 1957 to current day) which start indices from 1, the formula is

          element(n) = (address_of_array - size_of_the_element) + n * size_of_the_element

          which is just as simple as starting from 0 as (address_of_array - size_of_the_element) is a compile time constant value. Considering the millions of errors over the decades that starting from zero has perpetuated (e.g. forgetting to add one to the bounds when declaring the array or getting the end point wrong in loops or wasting space by deliberately skipping element 0), doing the compile time calculation would have been a small price to pay.

          S Offline
          S Offline
          svella
          wrote on last edited by
          #16

          jsc42 wrote:

          element(n) = (address_of_array - size_of_the_element) + n * size_of_the_element

          which is just as simple as starting from 0 as (address_of_array - size_of_the_element) is a compile time constant value.

          (address_of_array - size_of_the_element) is not a compile time constant value in any but the simplest of cases, i.e. where the array is at a fixed memory location every time the program is run, which is almost never.

          J 1 Reply Last reply
          0
          • C Clifford Nelson

            That may have made sense in the 1960's, but not really anymore. A simple addition and possibly a shift takes very time relative to all the other processing happening in a computer.

            P Offline
            P Offline
            PIEBALDconsult
            wrote on last edited by
            #17

            You don't know what else the computer is doing so don't assume that there are plenty of cycles. If every app wastes 10% of the "extra" cycles it doesn't take long to bog the whole thing down.

            C 1 Reply Last reply
            0
            • OriginalGriffO OriginalGriff

              Oh yes. Little tiny wasted instructions add up fast when you do them as often as array accesses. And remember, when this was decided, even HUGE computers ran at much, much, lower speeds - an IBM 360/195 could execute 16,000,000 instructions per second (at best), compared to the around 6,000,000,000 that your PC is (probably) capable of executing - it's difficult to be sure, due to multiple cores, pipelines, and caches, all of which were a lot smaller or nonexistent in those days. And remember, a 360/195 cost about £3,000,000 back in 1982, when beer was £0.30 per pint...so you didn't want to waste anything! :laugh:

              The universe is composed of electrons, neutrons, protons and......morons. (ThePhantomUpvoter)

              P Offline
              P Offline
              PIEBALDconsult
              wrote on last edited by
              #18

              OriginalGriff wrote:

              wasted instructions add up fast

              Which is why I detest animated widgets. X|

              1 Reply Last reply
              0
              • S svella

                jsc42 wrote:

                element(n) = (address_of_array - size_of_the_element) + n * size_of_the_element

                which is just as simple as starting from 0 as (address_of_array - size_of_the_element) is a compile time constant value.

                (address_of_array - size_of_the_element) is not a compile time constant value in any but the simplest of cases, i.e. where the array is at a fixed memory location every time the program is run, which is almost never.

                J Offline
                J Offline
                jsc42
                wrote on last edited by
                #19

                You are correct! What I meant (and I admit that the language that I used was far from rigorous) was that the relative offset is unvarying. If, for example, the offset of the start of the memory allocated for the array is 100 from a location (relative addressing / stack frame relative / absolute / whatever) and each element takes up 4 address locations (e.g. bytes), then all that the compiler does for 1-based indices is to use 96 + n * 4 (because 100 - 4 = 96) instead of 100 +(n - 1) * 4 in all of its address calculations for the array; this is as simple as using 100 + n * 4 for 0-based indices. This can be extended for arrays with specifiable lower bounds e.g. in this example if lwb is the lower bound, the 0-based index offset would be 100 + (n - lwb) * 4 [or more optimally (100 - lwb * 4) + n * 4] or for 1-based index offset would be (100 - (lwb + 1) * 4) + n * 4 = (96 - lwb * 4) + n * 4.

                S 1 Reply Last reply
                0
                • K kburman6

                  Link to the article For More detail explanation(PDF) Counting arrays from 0 simplifies the computation of the memory address of each element. If an array is stored at a given position in memory (it’s called the address) the position of each element can be computed as

                  element(n) = address + n * size_of_the_element
                  //If you consider the first element the first, the computation becomes

                  element(n) = address + (n-1) * size_of_the_element
                  //Not a huge difference but it adds an unnecessary subtraction for each access.

                  D Offline
                  D Offline
                  DarthDana
                  wrote on last edited by
                  #20

                  Also - The first positive number in any number system is zero. Another way to state it: All positive number systems start with zero.

                  1 Reply Last reply
                  0
                  • J jsc42

                    You are correct! What I meant (and I admit that the language that I used was far from rigorous) was that the relative offset is unvarying. If, for example, the offset of the start of the memory allocated for the array is 100 from a location (relative addressing / stack frame relative / absolute / whatever) and each element takes up 4 address locations (e.g. bytes), then all that the compiler does for 1-based indices is to use 96 + n * 4 (because 100 - 4 = 96) instead of 100 +(n - 1) * 4 in all of its address calculations for the array; this is as simple as using 100 + n * 4 for 0-based indices. This can be extended for arrays with specifiable lower bounds e.g. in this example if lwb is the lower bound, the 0-based index offset would be 100 + (n - lwb) * 4 [or more optimally (100 - lwb * 4) + n * 4] or for 1-based index offset would be (100 - (lwb + 1) * 4) + n * 4 = (96 - lwb * 4) + n * 4.

                    S Offline
                    S Offline
                    svella
                    wrote on last edited by
                    #21

                    Introduction of the lower bound would definitely negate any advantage of 0 based indexing. With no specified lower bound the cost at the instruction level would depend on the instruction set and processor, but with the instruction sets I am familiar with, 0 based indexing was definitely less expensive. Very simple case using x86 32 bit instructions and assuming that the array base in ESI and array index in EBX, accessing a 32 bit array value can be done in a single instruction in both cases: mov eax, [esi + 4*ebx] ; 0 based indexing mov eax, [esi + 4*ebx + 4] ; 1 based indexing On even the most modern x86 processor, the instruction with an offset takes more memory than the one without. On older x86 processors it would also cost CPU cycles, and on more primitive instruction sets you wouldn't even be able to encode the address calculations into a single instruction at all. One interpretation of your argument for same cost might be that in the one-based case that you just start with esi pointing to 4 bytes before, which would be true but you still have to count the cost of adjusting esi, though in some cases that calculation could be amortized across many array accesses.

                    1 Reply Last reply
                    0
                    • P PIEBALDconsult

                      You don't know what else the computer is doing so don't assume that there are plenty of cycles. If every app wastes 10% of the "extra" cycles it doesn't take long to bog the whole thing down.

                      C Offline
                      C Offline
                      Clifford Nelson
                      wrote on last edited by
                      #22

                      That is assuming that the developers of system code have not already optimized the code where it can be of the most benefit. Also, it assumes that the compiler is not smart enough to do some optimizations.

                      P 1 Reply Last reply
                      0
                      • C Clifford Nelson

                        That is assuming that the developers of system code have not already optimized the code where it can be of the most benefit. Also, it assumes that the compiler is not smart enough to do some optimizations.

                        P Offline
                        P Offline
                        PIEBALDconsult
                        wrote on last edited by
                        #23

                        Not at all. I'm saying that I could have a gazillion apps running.

                        C 1 Reply Last reply
                        0
                        • P PIEBALDconsult

                          Not at all. I'm saying that I could have a gazillion apps running.

                          C Offline
                          C Offline
                          Clifford Nelson
                          wrote on last edited by
                          #24

                          Relative to system calls, and library calls, the code in the application usually takes up little of the resources unless you have an application that is heavily processor bound.

                          P 1 Reply Last reply
                          0
                          • C Clifford Nelson

                            Relative to system calls, and library calls, the code in the application usually takes up little of the resources unless you have an application that is heavily processor bound.

                            P Offline
                            P Offline
                            PIEBALDconsult
                            wrote on last edited by
                            #25

                            And let's keep it that way.

                            1 Reply Last reply
                            0
                            • K kburman6

                              Link to the article For More detail explanation(PDF) Counting arrays from 0 simplifies the computation of the memory address of each element. If an array is stored at a given position in memory (it’s called the address) the position of each element can be computed as

                              element(n) = address + n * size_of_the_element
                              //If you consider the first element the first, the computation becomes

                              element(n) = address + (n-1) * size_of_the_element
                              //Not a huge difference but it adds an unnecessary subtraction for each access.

                              K Offline
                              K Offline
                              KP Lee
                              wrote on last edited by
                              #26

                              It was also handy back in the days when only single array indexes existed and you wanted dual indexes because everything mathematically matched up really handily without taking extra steps. for (i = 0; i < 10; i++)// Not at all like the format of older languages! { for (j = 0; j < 10: j++) { ind= i + j * 10; val[ind] = some value } } Or the other way around, find the two indexes from the current index: for (ind = 0; ind < 100; ind++) { j = ind/10; i = ind - (j * 10); }

                              1 Reply Last reply
                              0
                              Reply
                              • Reply as topic
                              Log in to reply
                              • Oldest to Newest
                              • Newest to Oldest
                              • Most Votes


                              • Login

                              • Don't have an account? Register

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • World
                              • Users
                              • Groups