簡體   English   中英

以下是什么意思。 C 語言中帶符號類型的二進制表示?

[英]What does the following mean wrt. binary representations of signed types in C language?

C 允許三種不同的符號表示:

• 符號和大小

• 一個的補碼

• 二進制補碼

前兩個現在可能只具有歷史或外來相關性:對於符號和幅度,幅度被視為正值,符號位僅指定存在負號。 1 的補碼取相應的正值並對所有位進行補碼。 這兩種表示都有兩個值評估為 0 的缺點:有一個正 0 和一個負 0。

  • 現代 C,延斯·古斯特

問題:根據最后一條語句(粗體),“兩個值計算為零”有什么問題?

根據最后一條語句(粗體),“兩個值評估為零”有什么問題?

示例:字符串

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 補碼的角落優勢對稱的正負范圍。 所有iabs(i)值。 -i對所有i都有效。 -1/x對於非零x從來都不是問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM