标题:弄一个简单数据提升和数据截断~
只看楼主
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
 问题点数:0 回复次数:4 
弄一个简单数据提升和数据截断~
如题,就是关于数据提升和数据截断问题,先放代码~

程序代码:
#include<stdio.h>

void test1( void );
void test2( void );

int main( void )
{
    puts("test1:");
    test1();
    puts("");

    puts("test2:");
    test2();

    return 0;
}

void test1( void )
{    
    int a=0xff000000;
    int k=( short )a;

    printf("a=%#x\n",a);
    printf("k=%#x\n",k);

}

void test2( void )
{
    short a=0xff00;
    int k=a;

    printf("a=%#hx\n",a);
    printf("k=%#x\n",k);
}


运行果为:

test1:
a=0xff000000
k=0

test2:
a=0xff00
k=0xffffff00


数据提升和数据截断的原理已经在源码里面简单演示,具体就不用多说了~

PS:补充一下,第一个test应该是数据截断,第二个才是数据提升(关键就是程序test与题目逻辑反过来了,特意说明一下)

其实这个可以看出编译器对数据类型的处理,我当然可以理解,就是发来看看可以从个代码看出多少东西了~


[此贴子已经被作者于2018-5-30 13:49编辑过]

搜索更多相关主题的帖子: 数据 截断 void int printf 
2018-05-30 13:42
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
赋值的类型转换,右按左转。
不同编译器某种情况可能有不同结果,早时一些编译器是内不变外会变,负数会变成正数的都有。

2018-05-30 19:44
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
printf("k=%#x\n",k);中的#是什么意思。
2018-05-30 20:38
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用花脸在2018-5-30 20:38:47的发言:

printf("k=%#x\n",k);中的#是什么意思。

# 标志字符。
对 c、s、d、u 类无影响;
对o类,在输出时加前缀0;
对x类,在输出时加前缀0x或者0X;
对g、G类,防止尾随0被删除;
对于所有的浮点形式,#保证了即使不跟任何数字,也打印一个小数点字符
2018-05-30 20:56
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 4楼 吹水佬
好的 谢谢。
2018-05-30 22:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-487423-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016405 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved