程序员的救赎 发表于 2018-6-20 23:44:43

当实参类型与函数的形参类型不一致时

当函数形参为int而传入double类型的参数时,为什么不是将double强制转换?而是输出了一个奇怪的值


#include<iostream>
using namespace std;

void doubleToInt(int test){
        cout<<"调用函数,传入double,参数为int,字节数为:"<<sizeof(test) << '\t' << test;
}


int main(){
        int int_number;
        double double_number;
       
        cin >> int_number;
        cin >> double_number;
        cout << "int_number:" << int_number<<endl;
        cout << "double_number:" << double_number<<endl;
        cout << "调用函数前" << endl << "int_number位数:" << sizeof(int_number) << endl << "double_number位数:" << sizeof(double_number) << endl;
        doubleToInt(double_number);
       
}

人造人 发表于 2018-6-20 23:44:44

这和函数调用没有关系


如果 bit64 的值超过了 bit32,那么转换结果是 0x80000000

人造人 发表于 2018-6-20 23:52:56

程序员的救赎 发表于 2018-6-20 23:54:41

本帖最后由 程序员的救赎 于 2018-6-21 00:02 编辑

人造人 发表于 2018-6-20 23:52


你试下输入长度超出int范围的double类型数据

xypmyp 发表于 2018-6-21 00:15:05

It is a scientific notation, 1e+09 simply means 1 x 10 to the ninth power. = 1000000000 which is a rounded up version of your 999 999 999.

To set formatting of floating variables you can use a combination of setprecision(n), showpoint and fixed.

#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;

void doubleToInt(int test) {
        cout << "调用函数,传入double,参数为int,字节数为:" << sizeof(test) << '\t' << test;
        std::getchar();
}


int main() {
        int int_number;
        double double_number;

        int_number = 123456789;
        double_number = 999999999;
        cout << "int_number:" << int_number << endl;
        cout << "double_number: " << setprecision(9) << double_number << endl;
        cout << "double_number: " << fixed << double_number << endl;
        cout << "double_number: " << showpoint << double_number << endl;

        cout << "调用函数前" << endl << "int_number位数:" << sizeof(int_number) << endl << "double_number位数:" << sizeof(double_number) << endl;
        doubleToInt(double_number);

        std::getchar();
        return 0;
}

人造人 发表于 2018-6-21 00:34:12






我不是很明白这些英文描述
要我猜的话就是
超了 32位的范围,结果就是 80000000H
超了 64位的范围,结果就是 8000000000000000H

人造人 发表于 2018-6-21 00:36:20



我看不懂这个

www.4399whs 发表于 2018-6-21 00:51:28

向你学习!

程序员的救赎 发表于 2018-6-21 12:58:10

xypmyp 发表于 2018-6-21 00:15
It is a scientific notation, 1e+09 simply means 1 x 10 to the ninth power. = 1000000000 which is a r ...

你理解错我的问题了,不是那个科学计数法的问题。。。

xypmyp 发表于 2018-6-21 18:03:57

程序员的救赎 发表于 2018-6-21 12:58
你理解错我的问题了,不是那个科学计数法的问题。。。

sorry 看錯了, 1e+09 看起來挺奇怪, 不好意思{:5_93:}

引用"人造人"
(我不是很明白这些英文描述
要我猜的话就是
超了 32位的范围,结果就是 80000000H
超了 64位的范围,结果就是 8000000000000000H)

int 正數只可以表示 2^(31) -1 = 2,147,483,647 個, 最高位為補碼; 80000000h = 2,147,483,648;
當 = 2,147,483,648 時 除了第32位, 其他全為0那結果就是 -2,147,483,648.

我理解為
如果數值 > 7FFFFFFFH && != 80000000H 的范围,结果就為 80000000H
那麼你打任何數 > 2147483648 的時候都會得出 -2147483648

* 但是改成 double_number = 2147483647 + 2 ;
輸出為 -2147483647 而不是 -2147483648

人造人 发表于 2018-6-21 18:22:38

xypmyp 发表于 2018-6-21 18:03
sorry 看錯了, 1e+09 看起來挺奇怪, 不好意思

引用"人造人"


2147483647 + 2 = 2147483649 = 0x80000001



人造人 发表于 2018-6-21 18:33:32

人造人 发表于 2018-6-21 18:34:15

1>c:\visualstudioprojects\c++\c++\main.cpp(14): warning C4307: “+”: 整型常量溢出

xypmyp 发表于 2018-6-21 19:02:47

人造人 发表于 2018-6-21 18:22
2147483647 + 2 = 2147483649 = 0x80000001

其實我都不太明白為何 2147483647 + 2 不是 = -2147483648 {:5_94:} 可能他用二個寄存器的原因吧?
我自己都不太肯定, 只是我的理解, 不想誤人子弟

人造人 发表于 2018-6-21 19:09:35

xypmyp 发表于 2018-6-21 19:02
其實我都不太明白為何 2147483647 + 2 不是 = -2147483648可能他用二個寄存器的原因吧?
我自 ...



2147483647 是 int 类型
2 是 int 类型

int 类型 + int 类型 = int 类型

人造人 发表于 2018-6-21 19:11:49

xypmyp 发表于 2018-6-21 19:02
其實我都不太明白為何 2147483647 + 2 不是 = -2147483648可能他用二個寄存器的原因吧?
我自 ...



2147483647LL 是 __int64 类型

__int64 类型 + int 类型 = __int64 类型

人造人 发表于 2018-6-21 19:15:32

xypmyp 发表于 2018-6-21 19:02
其實我都不太明白為何 2147483647 + 2 不是 = -2147483648可能他用二個寄存器的原因吧?
我自 ...

int 类型 + int 类型 = int 类型


人造人 发表于 2018-6-21 19:16:48

xypmyp 发表于 2018-6-21 19:02
其實我都不太明白為何 2147483647 + 2 不是 = -2147483648可能他用二個寄存器的原因吧?
我自 ...

页: [1]
查看完整版本: 当实参类型与函数的形参类型不一致时