在c语言中如果我事先声明此变量为unsigned int a;这时我再让 a=-67;为什么还成立呀,不是事先声明了无符号的吗??再赋值为负数为什么没问题呀??那有符号跟无符号除了范围不一样其他的不都一样了,,都可以表示负值??
"既然前面是unsigned int的,而-67本身是int型的,那就兜圈子呗,过了就溢出,溢出就从最小那个开始,对号入座嘛。”这句话不是太懂,,是咋个兜圈子呀,,我声明是unsigned 型,,输入为-67,关键计算的结果还是对的,,好像超出一定范围的负值它才会兜圈子???
编译器会把-67转化为无符号整型存储到a所在的地址里。
你可以试着使用
printf("%u\n", a);来试探编译器的行为。
理论上来说,既然你定义了一个无符号整型变量,你就对这个变量负责。对其赋值负数,属于人为的bug,应该尽量避免,编译器可能会发出警告,但是不会把它当作一个错误。
追问你的意思就是我用unsigned int 与int的意义是一样的,,起码对计算机来说是这样的,,那也就是我都用unsigned int 范围还更大,,不容易出现数据溢出??
追答意义是不一样的。既然你定义了unsigned int,那么你应该对这个定义负责。你用int赋值给unsigned int变量,编译器没有把这个操作当作错误而已,但是编译器一般会显示警告,告诉你这个操作带来的风险,作为一个程序员,应该尽量规避这样的操作,养成良好的代码习惯。
那也就是说我都用unsigned int 会更好,,还不容易出现数据溢出??
追答C语言的无符号数没有溢出之说
当然如果你觉得 “负一比任何正数都大” 是 “好” 情况的话,随意
关键我现在输入负值结果是对的,,比如—69,,之后输出的值正确,,但是如果负值较小,,才有问题??
关键我现在输入负值结果是对的,,比如—69,,之后输出的值正确,,但是如果负值较小,,才有问题??
追答你就是给 printf 一个字符,它也能当有符号数输出了,另外 scanf 也不会(实际上是无法)检查参数的类型。不过在任何其他情况下,把任何负数赋给unsigned int 类型的变量都有问题。
如果你的变量不用大于或小于号比较大小,不取相反数,不做任何其他数学运算,不使用API,大概有可能永远不会看到问题……
非常感谢,,我是个新手,,感谢赐教了
本回答被提问者和网友采纳