C++ auto on int16_t casts to integer Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern) The Ask Question Wizard is Live! Data science time! April 2019 and salary with experience Should we burninate the [wrap] tag?Are the “usual arithmetic conversions” and the “integer promotions” the same thing?Regular cast vs. static_cast vs. dynamic_castWhat are the differences between a pointer variable and a reference variable in C++?How can I profile C++ code running on Linux?The Definitive C++ Book Guide and ListWhat is the effect of extern “C” in C++?What is the “-->” operator in C++?Why do we need virtual functions in C++?Easiest way to convert int to string in C++C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?Why is reading lines from stdin much slower in C++ than Python?

How to bypass password on Windows XP account?

Right-skewed distribution with mean equals to mode?

Is the Standard Deduction better than Itemized when both are the same amount?

How can I fade player when goes inside or outside of the area?

What causes the vertical darker bands in my photo?

How can players work together to take actions that are otherwise impossible?

Why one of virtual NICs called bond0?

What does the "x" in "x86" represent?

Is there a concise way to say "all of the X, one of each"?

What do you call a phrase that's not an idiom yet?

Models of set theory where not every set can be linearly ordered

Are my PIs rude or am I just being too sensitive?

If Jon Snow became King of the Seven Kingdoms what would his regnal number be?

What would be the ideal power source for a cybernetic eye?

Does accepting a pardon have any bearing on trying that person for the same crime in a sovereign jurisdiction?

The logistics of corpse disposal

Why constant symbols in a language?

G-Code for resetting to 100% speed

Is the address of a local variable a constexpr?

Why is "Consequences inflicted." not a sentence?

What is the correct way to use the pinch test for dehydration?

If a contract sometimes uses the wrong name, is it still valid?

Is 1 ppb equal to 1 μg/kg?

What is a Meta algorithm?



C++ auto on int16_t casts to integer



Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)
The Ask Question Wizard is Live!
Data science time! April 2019 and salary with experience
Should we burninate the [wrap] tag?Are the “usual arithmetic conversions” and the “integer promotions” the same thing?Regular cast vs. static_cast vs. dynamic_castWhat are the differences between a pointer variable and a reference variable in C++?How can I profile C++ code running on Linux?The Definitive C++ Book Guide and ListWhat is the effect of extern “C” in C++?What is the “-->” operator in C++?Why do we need virtual functions in C++?Easiest way to convert int to string in C++C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?Why is reading lines from stdin much slower in C++ than Python?



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








17















I am pretty new to C++17 and am attempting to understand the decltype keyword and how it pairs with auto.



Below is a snippet of code that produces an unexpected result.



#include <typeinfo>
#include <iostream>
#include <algorithm>

using namespace std;

int main()

int16_t mid = 4;
auto low = mid - static_cast<int16_t>(2);
auto hi = mid + static_cast<int16_t>(2);

int16_t val;
cin >> val;

val = std::clamp(val,low,hi);

return 0;



Surprisingly, the compiler tells me there is a mismatch in clamp and that low and high are int. If I change auto to int16_t all is good in the world and all the types are int16_t as expected.



The question I'm posing is, why does auto cast low and hi to int when all of the types are int16_t? Is this a good use case for decltype?



Even after reading cppreference.com, I don't fully understand how decltype works, so excuse my ignorance.










share|improve this question






























    17















    I am pretty new to C++17 and am attempting to understand the decltype keyword and how it pairs with auto.



    Below is a snippet of code that produces an unexpected result.



    #include <typeinfo>
    #include <iostream>
    #include <algorithm>

    using namespace std;

    int main()

    int16_t mid = 4;
    auto low = mid - static_cast<int16_t>(2);
    auto hi = mid + static_cast<int16_t>(2);

    int16_t val;
    cin >> val;

    val = std::clamp(val,low,hi);

    return 0;



    Surprisingly, the compiler tells me there is a mismatch in clamp and that low and high are int. If I change auto to int16_t all is good in the world and all the types are int16_t as expected.



    The question I'm posing is, why does auto cast low and hi to int when all of the types are int16_t? Is this a good use case for decltype?



    Even after reading cppreference.com, I don't fully understand how decltype works, so excuse my ignorance.










    share|improve this question


























      17












      17








      17


      1






      I am pretty new to C++17 and am attempting to understand the decltype keyword and how it pairs with auto.



      Below is a snippet of code that produces an unexpected result.



      #include <typeinfo>
      #include <iostream>
      #include <algorithm>

      using namespace std;

      int main()

      int16_t mid = 4;
      auto low = mid - static_cast<int16_t>(2);
      auto hi = mid + static_cast<int16_t>(2);

      int16_t val;
      cin >> val;

      val = std::clamp(val,low,hi);

      return 0;



      Surprisingly, the compiler tells me there is a mismatch in clamp and that low and high are int. If I change auto to int16_t all is good in the world and all the types are int16_t as expected.



      The question I'm posing is, why does auto cast low and hi to int when all of the types are int16_t? Is this a good use case for decltype?



      Even after reading cppreference.com, I don't fully understand how decltype works, so excuse my ignorance.










      share|improve this question
















      I am pretty new to C++17 and am attempting to understand the decltype keyword and how it pairs with auto.



      Below is a snippet of code that produces an unexpected result.



      #include <typeinfo>
      #include <iostream>
      #include <algorithm>

      using namespace std;

      int main()

      int16_t mid = 4;
      auto low = mid - static_cast<int16_t>(2);
      auto hi = mid + static_cast<int16_t>(2);

      int16_t val;
      cin >> val;

      val = std::clamp(val,low,hi);

      return 0;



      Surprisingly, the compiler tells me there is a mismatch in clamp and that low and high are int. If I change auto to int16_t all is good in the world and all the types are int16_t as expected.



      The question I'm posing is, why does auto cast low and hi to int when all of the types are int16_t? Is this a good use case for decltype?



      Even after reading cppreference.com, I don't fully understand how decltype works, so excuse my ignorance.







      c++ c++17 auto decltype






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Apr 12 at 5:32









      Remy Lebeau

      344k19270464




      344k19270464










      asked Apr 12 at 4:24









      MaxMax

      7491925




      7491925






















          2 Answers
          2






          active

          oldest

          votes


















          18














          The problem isn't with auto here. When you subtract two int16_t values, the result is an int. We can demonstrate it with this code here:



          #include <iostream>
          #include <cstdint>
          using namespace std;

          template<class T>
          void print_type(T)
          std::cout << __PRETTY_FUNCTION__ << std::endl;


          int main()
          int16_t a = 10;
          int16_t b = 20;
          print_type(a);
          print_type(b);
          print_type(a - b);
          return 0;



          a and b are both short ints, but when you add or subtract them it produces a regular int. This is to help prevent overflow / and is also for backwards compatibility.






          share|improve this answer






























            4














            This phenomenon is called the usual arithmetic conversions. It is defined in the C and C++ standards and (roughly said) converts anything smaller than an int to an int. It converts larger types as well. Take some time and read about it, you'll need it quite often.






            share|improve this answer























              Your Answer






              StackExchange.ifUsing("editor", function ()
              StackExchange.using("externalEditor", function ()
              StackExchange.using("snippets", function ()
              StackExchange.snippets.init();
              );
              );
              , "code-snippets");

              StackExchange.ready(function()
              var channelOptions =
              tags: "".split(" "),
              id: "1"
              ;
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function()
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled)
              StackExchange.using("snippets", function()
              createEditor();
              );

              else
              createEditor();

              );

              function createEditor()
              StackExchange.prepareEditor(
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader:
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              ,
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              );



              );













              draft saved

              draft discarded


















              StackExchange.ready(
              function ()
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55644479%2fc-auto-on-int16-t-casts-to-integer%23new-answer', 'question_page');

              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              18














              The problem isn't with auto here. When you subtract two int16_t values, the result is an int. We can demonstrate it with this code here:



              #include <iostream>
              #include <cstdint>
              using namespace std;

              template<class T>
              void print_type(T)
              std::cout << __PRETTY_FUNCTION__ << std::endl;


              int main()
              int16_t a = 10;
              int16_t b = 20;
              print_type(a);
              print_type(b);
              print_type(a - b);
              return 0;



              a and b are both short ints, but when you add or subtract them it produces a regular int. This is to help prevent overflow / and is also for backwards compatibility.






              share|improve this answer



























                18














                The problem isn't with auto here. When you subtract two int16_t values, the result is an int. We can demonstrate it with this code here:



                #include <iostream>
                #include <cstdint>
                using namespace std;

                template<class T>
                void print_type(T)
                std::cout << __PRETTY_FUNCTION__ << std::endl;


                int main()
                int16_t a = 10;
                int16_t b = 20;
                print_type(a);
                print_type(b);
                print_type(a - b);
                return 0;



                a and b are both short ints, but when you add or subtract them it produces a regular int. This is to help prevent overflow / and is also for backwards compatibility.






                share|improve this answer

























                  18












                  18








                  18







                  The problem isn't with auto here. When you subtract two int16_t values, the result is an int. We can demonstrate it with this code here:



                  #include <iostream>
                  #include <cstdint>
                  using namespace std;

                  template<class T>
                  void print_type(T)
                  std::cout << __PRETTY_FUNCTION__ << std::endl;


                  int main()
                  int16_t a = 10;
                  int16_t b = 20;
                  print_type(a);
                  print_type(b);
                  print_type(a - b);
                  return 0;



                  a and b are both short ints, but when you add or subtract them it produces a regular int. This is to help prevent overflow / and is also for backwards compatibility.






                  share|improve this answer













                  The problem isn't with auto here. When you subtract two int16_t values, the result is an int. We can demonstrate it with this code here:



                  #include <iostream>
                  #include <cstdint>
                  using namespace std;

                  template<class T>
                  void print_type(T)
                  std::cout << __PRETTY_FUNCTION__ << std::endl;


                  int main()
                  int16_t a = 10;
                  int16_t b = 20;
                  print_type(a);
                  print_type(b);
                  print_type(a - b);
                  return 0;



                  a and b are both short ints, but when you add or subtract them it produces a regular int. This is to help prevent overflow / and is also for backwards compatibility.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Apr 12 at 4:36









                  J. Antonio PerezJ. Antonio Perez

                  2,720922




                  2,720922























                      4














                      This phenomenon is called the usual arithmetic conversions. It is defined in the C and C++ standards and (roughly said) converts anything smaller than an int to an int. It converts larger types as well. Take some time and read about it, you'll need it quite often.






                      share|improve this answer



























                        4














                        This phenomenon is called the usual arithmetic conversions. It is defined in the C and C++ standards and (roughly said) converts anything smaller than an int to an int. It converts larger types as well. Take some time and read about it, you'll need it quite often.






                        share|improve this answer

























                          4












                          4








                          4







                          This phenomenon is called the usual arithmetic conversions. It is defined in the C and C++ standards and (roughly said) converts anything smaller than an int to an int. It converts larger types as well. Take some time and read about it, you'll need it quite often.






                          share|improve this answer













                          This phenomenon is called the usual arithmetic conversions. It is defined in the C and C++ standards and (roughly said) converts anything smaller than an int to an int. It converts larger types as well. Take some time and read about it, you'll need it quite often.







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Apr 12 at 5:09









                          Roland IlligRoland Illig

                          31k96493




                          31k96493



























                              draft saved

                              draft discarded
















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid


                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.

                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function ()
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55644479%2fc-auto-on-int16-t-casts-to-integer%23new-answer', 'question_page');

                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Tamil (spriik) Luke uk diar | Nawigatjuun

                              Align equal signs while including text over equalitiesAMS align: left aligned text/math plus multicolumn alignmentMultiple alignmentsAligning equations in multiple placesNumbering and aligning an equation with multiple columnsHow to align one equation with another multline equationUsing \ in environments inside the begintabularxNumber equations and preserving alignment of equal signsHow can I align equations to the left and to the right?Double equation alignment problem within align enviromentAligned within align: Why are they right-aligned?

                              Training a classifier when some of the features are unknownWhy does Gradient Boosting regression predict negative values when there are no negative y-values in my training set?How to improve an existing (trained) classifier?What is effect when I set up some self defined predisctor variables?Why Matlab neural network classification returns decimal values on prediction dataset?Fitting and transforming text data in training, testing, and validation setsHow to quantify the performance of the classifier (multi-class SVM) using the test data?How do I control for some patients providing multiple samples in my training data?Training and Test setTraining a convolutional neural network for image denoising in MatlabShouldn't an autoencoder with #(neurons in hidden layer) = #(neurons in input layer) be “perfect”?