[英]What does the following mean wrt. binary representations of signed types in C language?
C 允許三種不同的符號表示:
• 符號和大小
• 一個的補碼
• 二進制補碼
前兩個現在可能只具有歷史或外來相關性:對於符號和幅度,幅度被視為正值,符號位僅指定存在負號。 1 的補碼取相應的正值並對所有位進行補碼。 這兩種表示都有兩個值評估為 0 的缺點:有一個正 0 和一個負 0。
問題:根據最后一條語句(粗體),“兩個值計算為零”有什么問題?
根據最后一條語句(粗體),“兩個值評估為零”有什么問題?
示例:字符串
當char
被簽名時,如果 integer 編碼不是 2 的補碼,那么這段代碼有什么問題?
size_t my_strlen(const char *s) {
const char *t = s;
while (*t) {
t++;
}
return t - s;
}
while (*t)
在 +0 和 -0 上都停止,而它應該只在 +0 上停止。
字符串處理
<string.h>
對於本子條款中的所有函數,每個字符都應被解釋為具有unsigned char
類型(因此每個可能的 object 表示都是有效的並且具有不同的值)。 C17 博士 7.24.1 3
應該使用
const unsigned char *t = s;
. 使用 2 的補碼,無論哪種方式都沒有區別。
基本問題是有時代碼應該區分 +0 和 -0,但普通代碼只看value ,而不是有符號的 integer 為 0 時的符號。
C2x預計需要 2 的補碼。
非 2 補碼的角落優勢:對稱的正負范圍。 所有i
的abs(i)
值。 -i
對所有i
都有效。 -1/x
對於非零x
從來都不是問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.