C ++保护超过整数限制

时间:2014-05-25 10:31:13

标签: c++ integer

我正在撰写一本书的章节评论:在本章的最后,您将完成一些问题/任务。

我决定以程序的格式而不是文本文件来执行它们:

#include <iostream>

int main(int argc, char* argv[]) {
std::cout << "Chapter review\n"
    << "1. Why does C++ have more than one integer type?\n"
        << "\tTo be able to represent more accurate values & save memory by only allocating what is needed for the task at hand.\n"

    << "2. Declare variables matching the following descriptions:\n"
        << "a.\tA short integer with the value 80:\n";
            short myVal1 = 80;
std::cout << "\t\t\"short myVal1 = 80;\": " << myVal1 << std::endl

        << "b.\tAn unsigned int integer with the value 42,110:\n";
            unsigned int myVal2 = 42110;
std::cout << "\t\t\"unsigned int myVal2 = 42110;\": " << myVal2 << std::endl

        << "c.\tAn integer with the value 3,000,000,000:\n";
            float myVal3 = 3E+9;
std::cout << "\t\t\"float myVal3 = 3E+9;\": " << static_cast<unsigned int>(myVal3) << std::endl

    << "3. What safeguards does C++ provide to keep you from exceeding the limits of an integer type?\n"
        << "\tWhen it reaches maximum number it starts from the begging again (lowest point).\n"

    << "4. What is the distinction between 33L and 33?\n"
            << "\t33L is of type long, 33 is of type int.\n"

    << "5. Consider the two C++ statements that follow:\n\tchar grade = 65;\n\tchar grade = 'A';\nAre they equivalent?\n"
            << "\tYes, the ASCII decimal number for 'A' is '65'.\n"

    << "6. How could you use C++ to find out which character the code 88 represents?\nCome up with at least two ways.\n"
            << "\t1: \"static_cast<char>(88);\": " << static_cast<char>(88) << std::endl; // 1.
            char myChar = 88;
std::cout   << "\t2: \"char myChar = 88;\": " << myChar << std::endl // 2.
            << "\t3: \"std::cout << (char) 88;\"  " << (char) 88 << std::endl // 3.
            << "\t4: \"std::cout << char (88);\": " << char (88) << std::endl // 4.

    << "7. Assigning a long value to a float can result in a rounding error. What about assigning long to double? long long to double?\n"
            << "\tlong -> double: Rounding error.\n\tlong long -> double: Significantly incorrect number and/or rounding error.\n"

    << "8. Evaluate the following expressions as C++ would:\n"
        << "a.\t8 * 9 + 2\n"
            << "\t\tMultiplication (8 * 9 = 72) -> addition (72 + 2 = 74).\n"
        << "b.\t6 * 3 / 4\n"
            << "\t\tMultiplication (6 * 3 = 18 -> division (18 / 4 = 4).\n"
        << "c.\t3 / 4 * 6\n"
            << "\t\tDivision (3 / 4 = 0) -> multiplication (0 * 6 = 0).\n"
        << "d.\t6.0 * 3 / 4\n"
            << "\t\tMultiplication (6.0 * 3 -> 18.0) -> division (18.0 / 4 = 4.5).\n"
        << "e.\t 15 % 4\n"
            << "\t\tDivision (15 / 4 = 3.75) Then returns the reminder, basically how many times can 4 go into 15 in this case that is 3 (3*4 = 12).\n"

    << "9. Suppose x1 and x2 are two type of double variables that you want to add as integers and assign to an integer variable. Construct a C++ statement for doing so. What if you wanted to add them as type double and then convert to int?\n"
        << "\t1: \"int myInt = static_cast<double>(doubleVar);\"\n\t2: \"int myInt = int (doubleVar);\".\n"

    << "10. What is the variable type for each of the following declarations?\n"
        << "a.\t\"auto cars = 15;\"\n\t\tint\n"
        << "b.\t\"auto iou = 150.37f;\"\n\t\tfloat\n"
        << "c.\t\"auto level = 'B';\"\n\t\tchar\n"
        << "d.\t\"auto crat = U'/U00002155';\"\n\t\twchar_t ?\n"
        << "e.\t\"auto fract = 8.25f/.25;\"\n\t\tfloat" << std::endl;

        return 0;
}

由于移动/其他一些现实生活中的东西,我读了第3章已经有一段时间了。

我在这里不确定的基本上是第3个问题:它以复数形式表示保障措施。

但是我只知道一个:它在达到最大值后再次从头开始?我在这里错过了什么吗?

如果您还看到其他任何错误,请告诉我 - 毕竟我这样做是为了学习:)。

3 个答案:

答案 0 :(得分:2)

基本上我不能接受评论作为答案,所以总结一下:

没有任何保障措施,我误解了@ n.m的问题。为我澄清。

10.e错误如@ Jarod42指出的那样,这是正确的。

谢谢!

答案 1 :(得分:0)

至于我&#34;声明整数变量,值为3,000,000,000&#34;是:

    unsigned anInteger = 3000000000;

导致c ++,第11个提供15个整数类型,unsigned int是可以存储如3 000 000 000这样的大整数的最小值。

答案 2 :(得分:0)

C ++将整数溢出归类为“未定义行为” - 任何事情都可能因此而发生。通过以下思考,这本身可称为“保护措施”(虽然它是一个延伸):

gcc有-ftrapv编译开关,当整数溢出发生时,程序会崩溃。这使您可以轻松调试溢出。这个功能是可行的,因为C ++使得程序在这些情况下崩溃是合法的(本质上是未定义的行为)。我认为C ++委员会在制定C ++标准的这一部分时会考虑到这个确切的情况。

这与例如Java,其中整数溢出导致环绕,并且可能更难调试。