我正在处理一些包含表单表达式的代码
-(sizeof(struct foo))
即a的否定,size_t我不清楚编译器在看到这个时C和C++标准需要什么.具体来说,从此处和其他地方四处查看,sizeof返回类型的无符号整数值size_t.当否定无符号整数时,我找不到任何指定行为的明确引用.有没有,如果有的话,它是什么?
编辑:好的,所以关于无符号类型的算术有一些很好的答案,但事实并非如此.如果否定,它是在无符号整数上运行,还是转换为有符号类型并对其执行某些操作?从标准中预期的行为是"想象它是相似幅度的负数,然后对无符号值应用'溢出'规则"?
我的问题与此问题有关,并且几乎没有问题.
对我来说最明显的(意味着我会在我的代码中使用它)解决上述问题就是这样:
uint8_t x = some value;
x = (int8_t)x >> 7;
是的,是的,我听到你们所有人......未定义的行为,这就是为什么我没有发布我的"解决方案".
我有一种感觉(也许只是我生病的头脑),术语"未定义的行为"在SO上被过度使用,只是为了证明如果问题被标记为c/c ++,那么就可以为某人辩护.
所以 - 让我们(暂时)抛开C/C++标准,思考日常生活/编程,真正的编译器实现以及它们为现代硬件生成的代码.
考虑到以下因素:
>>为有符号类型的算术移位和无符号类型的逻辑移位.div时发出类似于低级别的指令>>(我们在这里不讨论运算符重载).所以...有什么(任何当代编译器,硬件)的行为与上面提到的不同?简单地说,我是否应该担心右移有符号值而不是转换为算术移位?
我的"解决方案"仅在许多平台上编译为一个低级指令,而其他平台则需要多个低级指令.你会在代码中使用什么?
请真相;-)