c++程序設計實踐教程課本題目。實驗二 基本數據處理2_1
調試示例,有三個變量a,b,c,定義及賦值如下,請正確輸出它們的原值,其數據類型的定義是否正確?
#include<iostream>
void main()
{
short int a = 65535;
unsigned int b = -8;
long int c = 12.34;
cout << "a= " << a << endl;
cout << "b= " << b << endl;
cout << "c= " << c << endl;
}
期望的運行結果爲:
a= 65535;
b= -8;
c= 12.34;
這道題考的是short int 、unsigned int 、long int類型的範圍。
二話不說跑去百度了一下:https://blog.csdn.net/u012372584/article/details/77824218
自己也在自己的機子上運行了鏈接了的程序,發現64位機子也是一樣。
即short int 的範圍爲 -32768~32767。顯然上面的題目 a= -1。
分析:
65535存儲內容的二進制格式爲1111 1111 1111 1111,這個值傳給short int類型的 a變量,因爲首位爲1,故此值是負數,然後反碼加1, 0000 0000 0000 0000 +1 => 1,即a =-1
同理, 可以算一下-8的機器碼:
高位1,絕對值8的原碼爲 0000 0000 0000 0000 0000 0000 0000 1000
反碼,1111 1111 1111 1111 1111 1111 1111 0111
+1得到機器碼: 1111 1111 1111 1111 1111 1111 1111 1000
因爲是無符號類型的,所以b = 4294967288 (我直接算2的32次方減去8)
long int 是整型,小數值直接過濾掉了。
要想得到預期的輸出,可以按照以下代碼更改:
#include<iostream>
void main()
{
int a = 65535; // 或者unsigned short int a = 65535;
int b = -8;
double c = 12.34; // 或者float c = 12.34f;
cout << "a= " << a <<endl;
cout << "b= " << b <<endl;
cout << "c= " << c <<endl;
}