C语言关于数据类型范围的问题,请牛人解答

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言关于数据类型范围的问题,请牛人解答相关的知识,希望对你有一定的参考价值。

当输入的数据大于32767时,就不能正常显示了,请帮忙查出问题所在,并给予解答,谢谢!

# include <stdio.h>

void main()

int num;
/* 下面定义的各变量,分别代表个位,十位,百位,千位,万位,十万位以及位数 */
int indiv, ten, hundred, thousand;
int ten_thousand, hundred_thousand, place;

printf("请输入一个整数(0~999999):");
scanf("%d", &num);

/* 判断变量num的位数 */
if(num > 99999)
place = 6;
else if(num > 9999)
place = 5;
else if(num > 999)
place = 4;
else if(num > 99)
place = 3;
else if(num > 9)
place = 2;
else
place = 1;
printf("place = %d\n", place);

printf("每位数字为:");

/* 求出num在各位上的值 */
hundred_thousand = num/100000;
ten_thousand = (num - hundred_thousand*100000)/10000;
thousand = (num - hundred_thousand*100000 - ten_thousand*10000)/1000;
hundred = (num - hundred_thousand*100000 - ten_thousand*10000
- thousand*1000)/100;
ten = (num - hundred_thousand*100000 - ten_thousand*10000
- thousand*1000 - hundred*100)/10;
indiv = num - hundred_thousand*100000 - ten_thousand*10000
- thousand*1000 - hundred*100 - ten*10;

/* 判断变量num的位数,并根据位数做出相应的输出 */
switch(place)

case 1: printf("%d", indiv);
printf("\n反序数字为:");
printf("%d\n", indiv);
break;
case 2: printf("%d, %d", ten, indiv);
printf("\n反序数字为:");
printf("%d%d\n", indiv, ten);
break;
case 3: printf("%d, %d, %d", hundred, ten, indiv);
printf("\n反序数字为:");
printf("%d%d%d\n", indiv, ten, hundred);
break;
case 4: printf("%d, %d, %d, %d", thousand, hundred, ten, indiv);
printf("\n反序数字为:");
printf("%d%d%d%d\n", indiv, ten, hundred, thousand);
break;
case 5: printf("%d, %d, %d, %d, %d", ten_thousand, thousand,
hundred, ten, indiv);
printf("\n反序数字为:");
printf("%d%d%d%d%d\n", indiv, ten, hundred,
thousand, ten_thousand);
break;
case 6: printf("%d, %d, %d, %d, %d, %d", hundred_thousand,
ten_thousand, thousand, hundred, ten, indiv);
printf("\n反序数字为:");
printf("%d%d%d%d%d%d\n", indiv, ten, hundred, thousand,
ten_thousand, hundred_thousand);
break;
default: printf("Not find.\n");
break;

getch();

感谢各位的答案,但没有解决最终问题,改了类型,可程序运行出来的数据还是有问题!

参考技术A 因为你定义的是 int型数据

C系统中,int行数据占2个字节,共16位,最大只能表示32767,所以你要把数据类型定义为long int才可以成功,嘿嘿

或者定义为unsigned int型,范围比int大一倍
参考技术B C系统中,int行数据占2个字节,共16位,最大只能表示32767,所以你要把数据类型定义为long int才可以成功
int型数据只能表示-32768~+32767;
unsigned int 只能表示 无符号数据0~65535;
long unsigned int 型表达的数据范围是最广的,但也是有范围的。
参考技术C int型数据只能表示-32768~+32767;
unsigned int 只能表示 无符号数据0~65535;
long unsigned int 型表达的数据范围是最广的,但也是有范围的。
不知道你有没有学过数组,你上面的算法太麻烦了,用数组可以省很多。。。而且也不难。

要知详情,请给本人留言。
参考技术D 不要定义int型 改用long类型

关于C语言的语法中类型转换的一个问题。求教C语言高手。

在Lua语言的源代码中有如下宏定义:
#define UNUSED(x) ((void)(x)) /* to avoid warnings */
有如下用法:
static void f_luaopen (lua_State *L, void *ud) global_State *g = G(L);// get global_State ptr saved in lua_State UNUSED(ud);// 这一句看不懂,求指导~ stack_init(L, L); /* init stack */ sethvalue(L, gt(L), luaH_new(L, 0, 2)); /* table of globals */ sethvalue(L, registry(L), luaH_new(L, 0, 2)); /* registry */ luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ luaT_init(L); luaX_init(L); luaS_fix(luaS_newliteral(L, MEMERRMSG)); g->GCthreshold = 4*g->totalbytes;
我不知道上面函数中第二句的作用。求指教!谢谢!

参考技术A 有误吧?UNUSED的宏定义是变量类型,而代码中UNUSED(ud)的ud是指针啊!如果宏定义是#define UNUSED(x) ((void *)(x))的话就正确了。 参考技术B #define UNUSED(x) ((void)(x)) 这是宏定义 在编译的时候 把UNUSED(x)替换为((void)(x))编译
就像#define PI 3.14一样
所以那句在编译的时候按照((void)(ud))编译追问

谢谢您的回答!

我能理解您的意思。但是单独的一行转换

((void)ud);

有什么意义呢?

下面是源代码:

追答

你注释说的很清楚了 避免警告 如果ud只定义不使用 编译时就会有警告 单独这一句就是为了使用它 避免警告 你可以把这句注释掉再编译试试 比较不同

追问

学习了!谢谢您!

本回答被提问者采纳

以上是关于C语言关于数据类型范围的问题,请牛人解答的主要内容,如果未能解决你的问题,请参考以下文章

C语言各个数据类型取值范围

请牛人解释一下jquery和html5的关系?

C语言里,关于数据类型的大小问题

c语言中,基本数据类型的数值范围是怎么计算出来的?

C语言各个数据类型取值范围

c语言中数据类型的范围是根据啥计算的,麻烦详细点.谢谢!