求NGA大佬解一C语言题

ChrolloXIX-avatar

ChrolloXIX

2020-03-22T03:48:48+00:00

[img]https://img.nga.178.com/attachments/mon_202003/26/-7Q5-i49uK1iT3cSnz-cj.png[/img]
如图,我知道TC2.0与CREE差别在于TC2.0 int占2字节,CREE int占4字节。但当我把a重新定义为CREE中同样占2字节的short int后,b=1000000的结果依然没有变化。请问是CREE与TC2.0仍有其他方面的不同吗?(我是选修C语言的菜鸡)(周五就要交了,我真的百度不到……[s:ac:呆])
[img]https://img.nga.178.com/attachments/mon_202003/26/-7Q5-a7qtZjT3cSsj-it.png[/img]
Fighterjones42-avatar

Fighterjones42

全部用 LONG LONG
Ghosty-avatar

Ghosty

gcc(也就是mingw)已经没有两字节整数了吧。short也是四字节。
Bridget-avatar

Bridget

16960就是1000000二进制去掉前面四位数,也就是你的b要最高只能有16位[s:ac:哭笑]所以我觉得应该是不要给b用long吧
ChrolloXIX-avatar

ChrolloXIX

Reply to [pid=408098799,20991151,1]Reply[/pid] Post by [uid=60229714]葛言葛语[/uid] (2020-03-26 11:59)
那请问均是两字节的a相乘会导致其结果b也是两字节吗?
LeGorde-avatar

LeGorde

long int保证不比int短,但不保证一定比int长,
所以你print一下sizeof(long int)看看好了
Diman-avatar

Diman

改以后的a是short int2字节,但是b是long int应该是8字节吧,结果对是预期之内。 补充一下,那个结果10000000是需要4个字节,只要你用来存它的那个变量是4个字节以上就可以。
NEG RUSKA-avatar

NEG RUSKA

溢出了呗。
如果真要跨编译器的话,建议不要用内置数据类型了。
BAB-avatar

BAB

你用的这俩编译器我都没用过,只能从原理上提示下

b=a*a这一行,先是乘法,后是赋值

在你的程序里,虽然a是short,但a*a是int(4字节),这应该是编译器的设置,然后int又赋值到long int导致最终结果正确

我不清楚你为啥想在cfree上复现tc的bug,你该做的不应该是保证两者都正确就行了嘛?
RAFu-avatar

RAFu

最简单的应该就是全部改用4字节的类型,2字节长度不足以记录1000*1000的二进制长度

话说怎么好久远的感觉,我从学c开始在32位系统上int就默认4字节了[s:ac:哭笑],这是什么片上系统吗