皮尔斯 发表于 2019-5-22 16:48:13

C语言除法运算问题

比如(-2)/2,在short int 中,-2是65534,如果对65534除以2,就跳到正数的区域了。,但实际的运算结果是-1,应该是65535。C语言在除法运算中,我们需要手动把负数转换成正数,计算完再转换回负数吗?

20061002838 发表于 2019-5-22 16:51:30

short int 数据范围是 -32768~~32767 ,没有65534

1a2b3c 发表于 2019-5-22 16:51:51

要是那样的话就太不智能了嘛,你想多了应该是,还不如用汇编:)

皮尔斯 发表于 2019-5-22 16:59:48

20061002838 发表于 2019-5-22 16:51
short int 数据范围是 -32768~~32767 ,没有65534

short int的-2和unsigned short int的65534在内存里应该是同一个值吧,把他们两个都去除以2,能得出不同的结果吗

takashiki 发表于 2019-5-22 17:07:03

皮尔斯 发表于 2019-5-22 16:59
short int的-2和unsigned short int的65534在内存里应该是同一个值吧,把他们两个都去除以2,能得出不同 ...

必须不同。这个问题您自己查一下反汇编就知道了,编译器怎么可能那么傻

nanfang2000 发表于 2019-5-22 17:08:15

你如果是常数直接除,应该是按照int来算的所以不会有疑问,如果是变量,编译器根据变量类型来除的,结果当然是不同的

皮尔斯 发表于 2019-5-22 17:08:23

{:lol:}是这样啊,在编译器反汇编的时候就会解决这个问题吗

皮尔斯 发表于 2019-5-22 17:08:55

takashiki 发表于 2019-5-22 17:07
必须不同。这个问题您自己查一下反汇编就知道了,编译器怎么可能那么傻 ...

{:lol:} 是这样啊,编译器在反汇编的时候就会解决这个问题吗

cqfeiyu 发表于 2019-5-22 17:09:36

符号型计算,编译器自动处理。

20061002838 发表于 2019-5-22 17:09:55

皮尔斯 发表于 2019-5-22 16:59
short int的-2和unsigned short int的65534在内存里应该是同一个值吧,把他们两个都去除以2,能得出不同 ...

如果要得到一样的结果,那汇编指令何必设计成SDIV和UDIV两种,16位数扩展成32位何必要分成有符号扩展和无符号扩展

皮尔斯 发表于 2019-5-22 17:10:43

20061002838 发表于 2019-5-22 17:09
如果要得到一样的结果,那汇编指令何必设计成SDIV和UDIV两种,16位数扩展成32位何必要分成有符号扩展和无 ...

有道理{:lol:}

su33691 发表于 2019-5-22 17:13:14

写几行代码测试一下,比发帖问快多了。{:lol:}

皮尔斯 发表于 2019-5-22 17:20:19

su33691 发表于 2019-5-22 17:13
写几行代码测试一下,比发帖问快多了。

我一开始是想运算的问题会不会跟硬件有关系,有的硬件会自动识别正负,有的硬件比较低级就不会。没想到这一步是编译器做的
页: [1]
查看完整版本: C语言除法运算问题