C语言 int 和long int 问题

{#include<stdio.h>
void main ()
int a,b;
scanf("%d",&b);
if(b ==100) a=9;
else a=b/10 ;
switch(a)
{
case 0:printf("a\n"); break;
case 1:printf("b\n"); break;
case 2:printf("c\n"); break;
case 3:printf("d\n"); break;
default:printf("error\n ");
}
}
以上是我的C语言练习题里的一道题
困惑是int a,b; 这句 我不明白的是int 和long int在这里应该没什么区别
但是实际上 当输入比如23时 用int a,b; 就可以正确输出c 而用
long int a,b; 就会输出 error
既然都是整形 长短不同为什么输出的结果有不同。。。。 请高手解答下 谢谢

不同平台, int 和long int 长度可能不一样,
这时候在X86平台下,你的scanf("%d",&b)输入long int就会出错,
这又和字节序有关,x86系列CPU采用little endian方式存储数据,简单的说就是数据的高字节在低地址,低字节在高地址.

将&b开始的存储空间从低字节->高字节依次记为b0 b1 b2 b3 b4 b5 b6 b7
当b 为int 则scanf("%d",&b)将数据存储在b0 b1 b2 b3地址中,
低字节存放在b3,如你输入的23就存在b3中,而b0=b1=b2=0.
当b为long int时,如果是64位CPU,则long int长度为8字节,这时实际数据的低字节应该存放在b7中,最高字节存放在b0中.可是你的scanf语句的参数确将b当成整数类型,输入的数据低字节不是存放在b7只是存储在b3,结果本来应该是b7=23 b0=b1=...b6 = 0,可是你的错误导致了b3=23,b0=b1=b2=0, b4,b5,b6,b7随机数.

所以当b为long int时,改成scanf("%ld",&b)就对了.

参考资料:说得有点请勿乱参考啊

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-21
在C语言中,int即整型类型,long int等同于long,为长整型类型。
二者区别与编译器相关。
1 16位编译器。
int占2字节,范围为-32768~32767
long int占4字节,范围为-2147483648~2147483647
2 32位编译器。
int 和long均占4字节,范围均为-2147483648~2147483647
3 64位编译器。
int 占4字节,范围为-2147483648~2147483647
long因平台实现不同而不同,有4字节,6字节和8字节三种。可以打印sizeof(long)查看。
第2个回答  2009-02-05
int 和long int 语法上 有区别

正规写法:
long int -- 32 位有符号整型
short int -- 16 位有符号整型

编译器 允许的 简略写法:
long -- 32 位有符号整型
short -- 16 位有符号整型

如果写成 int, 那么是不确定 写法,长度由编译器自行规定
TC int -- 16 位有符号整型, 即 short int
MS VC++ int -- 32 位有符号整型, 即 long int

输入语句,long int 用 %ld ,short int 用 %d
编译器 也许通融 %d 既可读 long 也可读 short。
第3个回答  2009-02-05
vc++6.0 验证通过。。。不管是long int or int 都能通过编译,并得到正确结果
第4个回答  2009-02-05
这个看环境16位环境int和long int一个16位一个32位,一个要用%d一个要用%ld

而32位环境int和long int %d和%ld是一样的都是32位

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网