2的100次方到底有多大?

如题,当数字非常大,超出认知范围时,往往不能正确认识其表示的内容本身。希望有些具体的易理解的例子,谢谢。 -----------------分割线------------------ 看了大家的答案,有人列出了具体二进制数,有的列了数据范围,甚至有人列了10^31数量级的精确数,但可能这不是我问这个问题的本意。生活中或者学习中我们会遇到很多特别巨大或者特别微小的数字,而因为诸如科学计数法、幂次方、阶乘等一些表示方法,使我们更难认识到数字…
关注者
640
被浏览
742,788
有辣么大:1267650600228229401496703205376
-------------------------------------------
看到评论中有人问我是怎么算出这个数的,就酱紫:
其实这个数并不算大,至少Windows上的计算器可以精确计算。
知乎上有另一个问题:31! 的结尾有多少个0?
31! = 82 2283 8654 1779 2281 7725 5628 8000 0000
还碰到过一个更变态的问题:99999的阶乘的第一位数是几?
于是写了一个C++小程序,用于计算大数相乘:
#include <cstring>
#include <cstdio>
#include <assert.h>
#include <malloc.h>
#include <Windows.h>
#include <cmath>
#include <cfloat>
#include <vector>

class Integer
{
public:
    Integer()
    {
        
    }

    Integer(unsigned int value)
    {
        SetValue(value);
    }

    ~Integer()
    {
        Clear();
    }

    void SetValue(unsigned int value)
    {
        Clear();

        unsigned int v;
        while (value > 0)
        {
            v = value % 10000;
            m_vecNodes.push_back(v);
            value /= 10000;
        }
    }

    void Clear()
    {
        m_vecNodes.clear();
    }

    void Multiply(unsigned int v)
    {
        size_t count = m_vecNodes.size();

        for (size_t i = 0; i < count; i++)
        {
            if (m_vecNodes[i])
            {
                m_vecNodes[i] *= v;
            }
        }

        for (size_t i = 0; i < count; i++)
        {
            if (m_vecNodes[i] > 10000)
            {
                unsigned int k = m_vecNodes[i] / 10000;
                m_vecNodes[i] %= 10000;

                if (i < count - 1)
                {
                    m_vecNodes[i + 1] += k;
                }
                else
                {
                    while (k > 0)
                    {
                        unsigned int vv = k % 10000;
                        m_vecNodes.push_back(vv);
                        k /= 10000;
                    }
                }
            }
        }
    }

    void Print() const
    {
        size_t count = m_vecNodes.size();

        if (count == 0)
        {
            return;
        }

        if (m_vecNodes[count - 1] > 999)
        {
            printf("%d ", m_vecNodes[count - 1]);
        }
        else if (m_vecNodes[count - 1] > 99)
        {
            printf(" %d ", m_vecNodes[count - 1]);
        }
        else if (m_vecNodes[count - 1] > 9)
        {
            printf("  %d ", m_vecNodes[count - 1]);
        }
        else
        {
            printf("   %d ", m_vecNodes[count - 1]);
        }

        for (int i = (int)(count - 2); i >= 0; i--)
        {
            if (m_vecNodes[i] > 999)
            {
                printf("%d ", m_vecNodes[i]);
            }
            else if (m_vecNodes[i] > 99)
            {
                printf("0%d ", m_vecNodes[i]);
            }
            else if (m_vecNodes[i] > 9)
            {
                printf("00%d ", m_vecNodes[i]);
            }
            else
            {
                printf("000%d ", m_vecNodes[i]);
            }

            if (i % 10 == 0)
            {
                printf("\r\n");
            }
        }
    }

    bool SaveToFile(const char* szFileName) const
    {
        size_t count = m_vecNodes.size();

        if (count == 0)
        {
            return false;
        }

        FILE * fp = ::fopen(szFileName, "wb");
        if (!fp)
        {
            return false;
        }
        if (m_vecNodes[count - 1] > 999)
        {
            fprintf(fp, "位数: %d \r\n", (count - 1)*4 + 4);
            fprintf(fp, "%d ", m_vecNodes[count - 1]);
        }
        else if (m_vecNodes[count - 1] > 99)
        {
            fprintf(fp, "位数: %d \r\n", (count - 1)*4 + 3);
            fprintf(fp, " %d ", m_vecNodes[count - 1]);
        }
        else if (m_vecNodes[count - 1] > 9)
        {
            fprintf(fp, "位数: %d \r\n", (count - 1)*4 + 2);
            fprintf(fp, "  %d ", m_vecNodes[count - 1]);
        }
        else
        {
            fprintf(fp, "位数: %d \r\n", (count - 1)*4 + 1);
            fprintf(fp, "   %d ", m_vecNodes[count - 1]);
        }

        unsigned int itor = 1;

        for (int i = (int)(count - 2); i >= 0; i--)
        {
            if (m_vecNodes[i] > 999)
            {
                fprintf(fp, "%d ", m_vecNodes[i]);
            }
            else if (m_vecNodes[i] > 99)
            {
                fprintf(fp, "0%d ", m_vecNodes[i]);
            }
            else if (m_vecNodes[i] > 9)
            {
                fprintf(fp, "00%d ", m_vecNodes[i]);
            }
            else
            {
                fprintf(fp, "000%d ", m_vecNodes[i]);
            }

            if ((++itor) % 10 == 0)
            {
                fprintf(fp, "\r\n");
            }
        }

        ::fclose(fp);

        ShellExecuteA(NULL, "open", szFileName, NULL, NULL, SW_SHOWNORMAL);

        return true;
    }

    std::vector<unsigned int> m_vecNodes;
};

void main()
{
    Integer aaaa;
    aaaa.m_vecNodes.resize(65536*256);

    aaaa.SetValue(31);
    for (unsigned int i = 30; i > 1; i--)
    {
        aaaa.Multiply(i);
    }
    aaaa.SaveToFile("c:\\31.txt");

    aaaa.SetValue(99999);
    for (unsigned int i = 99998; i > 1; i--)
    {
        aaaa.Multiply(i);
        if (i % 50 == 0)
        {
            printf("%d \r\n", i);
        }
    }
    
    aaaa.SaveToFile("c:\\99999.txt");
}
执行该程序后,会生成存放99999阶乘的一个文件:
文件大小有580K,位数: 456569